• 教程七 在Go中使用Energy创建跨平台GUI - Cookies


     教程-示例-文档 


    介绍

    本文介绍在energy中的cookie操作

    在energy中可以对cookie的增加、修改和删除以达到某种目的

    对cookie操作时,是以调用功能函数后触发事件的方式返回调用功能函数的结果

    运行此示例,需要安装好Go和Energy开发环境:教程一 环境安装

    此示例中采用了内置http服务访问内嵌资源: 内置http服务

    功能函

    • VisitAllCookies 获取所有cookie
    • ​VisitURLCookies 获取指定URL cookie
    • DeleteCookies 删除cookie
    • SetCookie 设置cookie

    事件函数

    • OnCookiesVisited 调用功能函数VisitURLCookies 和 VisitAllCookies 时触发
    • OnCookiesDeleted 调用功能函数 DeleteCookies 时触发
    • OnCookieSet 调用功能函数 SetCookie 时触发
    • OnCookieVisitorDestroyed 调用功能函数 VisitURLCookies 和 VisitAllCookies ,有销毁时触发

    使用方式

    在主进程中,使用事件机制监听,用于在html javascript中使用事件方式调用Go函数

    ipc.IPC.Browser().SetOnEvent

    在主进程主窗口初始化时设置事件监听

    cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.TCefWindowInfo) 

    事件监听在Go中监听的事件, 用于在Go的其它进程或渲染(Render)进程(web html)中调用

    event.On

    在事件监听中获取主窗口信息

    在主窗口对象中获得chromium对象
    var info = cef.BrowserWindow.GetWindowInfo(context.BrowserId())

    在javascript代码使用ipc.emit触发Go监听的事件

    ipc.on 事件监听

    ipc.emit 事件触

    Go代码示例

    1. package main
    2. import (
    3. "embed"
    4. "encoding/json"
    5. "fmt"
    6. "github.com/energye/energy/cef"
    7. "github.com/energye/energy/common/assetserve"
    8. "github.com/energye/energy/consts"
    9. "github.com/energye/energy/ipc"
    10. "github.com/energye/golcl/lcl"
    11. "time"
    12. )
    13. //资源目录,内置到执行程序中
    14. //go:embed resources
    15. var resources embed.FS
    16. //这个示例使用了几个事件来演示下载文件
    17. func main() {
    18. //全局初始化 每个应用都必须调用的
    19. cef.GlobalCEFInit(nil, &resources)
    20. //创建应用
    21. cefApp := cef.NewApplication(nil)
    22. //主窗口的配置
    23. //指定一个URL地址,或本地html文件目录
    24. cef.BrowserWindow.Config.DefaultUrl = "http://localhost:22022/cookie.html"
    25. ipc.IPC.Browser().SetOnEvent(func(event ipc.IEventOn) {
    26. //监听获取cookie事件
    27. event.On("VisitCookie", func(context ipc.IIPCContext) {
    28. fmt.Println("VisitCookie")
    29. info := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
    30. info.Chromium().VisitURLCookies("https://www.baidu.com", true, 1)
    31. info.Chromium().VisitAllCookies(1)
    32. context.Result().SetString("执行成功,结果将在 SetOnCookiesVisited 事件中获得")
    33. })
    34. //监听删除cookie
    35. event.On("DeleteCookie", func(context ipc.IIPCContext) {
    36. info := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
    37. info.Chromium().DeleteCookies("", "", false)
    38. context.Result().SetString("执行成功,结果将在 SetOnCookiesDeleted 事件中获得")
    39. })
    40. //监听设置cookie
    41. event.On("SetCookie", func(context ipc.IIPCContext) {
    42. info := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
    43. info.Chromium().SetCookie("https://www.example.com", "example_cookie_name", "1234", "", "/", true, true, false, time.Now(), time.Now(), time.Now(), consts.Ccss_CEF_COOKIE_SAME_SITE_UNSPECIFIED, consts.CEF_COOKIE_PRIORITY_MEDIUM, false, 0)
    44. info.Chromium().SetCookie("https://www.example.com", "example_cookie_name2", "123422", "", "/", true, true, false, time.Now(), time.Now(), time.Now(), consts.Ccss_CEF_COOKIE_SAME_SITE_UNSPECIFIED, consts.CEF_COOKIE_PRIORITY_MEDIUM, false, 0)
    45. info.Chromium().SetCookie("https://www.baidu.com", "demo_name", "4321", "", "/", true, true, false, time.Now(), time.Now(), time.Now(), consts.Ccss_CEF_COOKIE_SAME_SITE_NO_RESTRICTION, consts.CEF_COOKIE_PRIORITY_MEDIUM, false, 1)
    46. context.Result().SetString("执行成功,结果将在 SetOnCookieSet 事件中获得")
    47. })
    48. })
    49. //在SetBrowserInit中设置cookie事件,这些事件将返回操作后的结果
    50. cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.TCefWindowInfo) {
    51. //获取cookie时触发
    52. event.SetOnCookiesVisited(func(sender lcl.IObject, cookie *cef.ICefCookie) {
    53. fmt.Printf("SetOnCookiesVisited: %+v\n", cookie)
    54. //将结果返回到html中
    55. args := ipc.NewArgumentList()
    56. data, _ := json.Marshal(cookie)
    57. args.SetString(0, string(data), true)
    58. browserWindow.Chromium().Emit("VisitCookieResult", args, nil)
    59. })
    60. //删除cookie时触发
    61. event.SetOnCookiesDeleted(func(sender lcl.IObject, numDeleted int32) {
    62. fmt.Printf("SetOnCookiesDeleted: %+v\n", numDeleted)
    63. })
    64. //设置cookie时触发
    65. event.SetOnCookieSet(func(sender lcl.IObject, success bool, ID int32) {
    66. fmt.Println("SetOnCookieSet: ", success, ID)
    67. })
    68. event.SetOnCookiesFlushed(func(sender lcl.IObject) {
    69. fmt.Println("OnCookiesFlushed")
    70. })
    71. event.SetOnCookieVisitorDestroyed(func(sender lcl.IObject, ID int32) {
    72. fmt.Println("OnCookieVisitorDestroyed")
    73. })
    74. })
    75. //在主进程启动成功之后执行
    76. //在这里启动内置http服务
    77. //内置http服务需要使用 go:embed resources 内置资源到执行程序中
    78. cef.SetBrowserProcessStartAfterCallback(func(b bool) {
    79. fmt.Println("主进程启动 创建一个内置http服务")
    80. //通过内置http服务加载资源
    81. server := assetserve.NewAssetsHttpServer()
    82. server.PORT = 22022 //服务端口号
    83. server.AssetsFSName = "resources" //必须设置目录名和资源文件夹同名
    84. server.Assets = &resources
    85. go server.StartHttpServer()
    86. })
    87. //运行应用
    88. cef.Run(cefApp)
    89. }

    html代码示例

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>cookie</title>
    6. <style type="text/css">
    7. button {
    8. margin: 10px;
    9. }
    10. </style>
    11. <script type="application/javascript">
    12. function message() {
    13. return document.getElementById("message");
    14. }
    15. //显示cookie
    16. function VisitCookie() {
    17. message().innerHTML = "";
    18. //触发go中监听的事件
    19. ipc.emit("VisitCookie", function (data) {
    20. message().innerHTML = data;
    21. });
    22. }
    23. //显示cookie的结果,从go中返回到html
    24. ipc.on("VisitCookieResult", function (data) {
    25. message().innerHTML = message().innerHTML + data + "

      "
      ;
    26. });
    27. //删除cookie
    28. function DeleteCookie() {
    29. message().innerHTML = "";
    30. //触发go中监听的事件
    31. ipc.emit("DeleteCookie", function (data) {
    32. message().innerHTML = data;
    33. });
    34. }
    35. //设置cookie
    36. function SetCookie() {
    37. message().innerHTML = "";
    38. //触发go中监听的事件
    39. ipc.emit("SetCookie", function (data) {
    40. message().innerHTML = data;
    41. });
    42. }
    43. </script>
    44. </head>
    45. <body style="overflow: hidden;margin: 0px;padding: 0px;">
    46. <button onclick="VisitCookie()">查看cookie</button>
    47. <button onclick="DeleteCookie()">删除cookie</button>
    48. <button onclick="SetCookie()">设置cookie</button>
    49. <br>
    50. <div id="message">
    51. </div>
    52. </body>
    53. </html>

    示例效果图 - cookie

  • 相关阅读:
    华为云开发者官网首页焕新升级,赋能开发者云上成长
    【Vue】详细介绍下Vue中v-for的使用方法
    测开 - 进阶篇 - 细节狂魔
    openEuler 系统操作 Docker Compose 容器化部署 Redis Cluster 集群的节点添加、删除和可视化监控
    文献阅读5
    -钞票兑换-
    GitHub每日最火火火项目(9.16)
    python调用c++动态库
    nextTick()方法的使用
    使用企业微信移动办公效果如何?
  • 原文地址:https://blog.csdn.net/snxamdf/article/details/128069673