从HTML调用Golang

时间:2018-11-27 01:06:39

标签: javascript html go raspberry-pi

我正在帮助一个开源项目。这是一个运行在包含Raspberry Pi的设备上的小型Go网络服务器。我希望能够让用户单击html屏幕上的一个按钮,该按钮在Go中调用一个例程,该例程返回2个值,一个布尔值和一个字符串。

我们想要做的是查看树莓派上的哪些网络接口,例如局域网连接建立了吗?

为此,我确实需要从每个界面ping一个站点。这三个接口(局域网,WiFi和3G)中的每个接口都需要花费几秒钟。

我可以在请求页面时执行此操作,并在页面加载时填写html模板,但这意味着可能要等待10到15秒才能加载页面,因此好像有些东西坏了。

因此,我希望能够列出页面上的3个界面中的每个界面,并让用户单击“测试”,然后在底层Go Web服务器中调用例程。

然后,我需要能够在每个界面的几个文本区域中显示通话结果。

我尝试过的事情:

我尝试使用net / html包中的funcmap注册一个Go函数(在本例中为IsLANConnectionUp),然后从JavaScript函数的html模板中调用它,如下所示:

  <button onclick = "getLANStatus()" class="btn btn-primary">Test</button>
 
  <script>
    function getLANStatus() {
        var status = document.getElementById('status');
        {{ if IsLANConnectionUp }}
          status.innerHTML = "Lan is up!"
        {{ else }}
          status.innerHTML = "Lan is down!"
        {{ end }}
    }
  </script>

但是将模板代码包含在javascript代码中似乎不起作用。另外,我想从ping命令输出文本(我的Go函数getLANStatus和我不知道如何从函数调用中提取该数据。文档说只能返回一个值。

在StackOverflow上搜索,我看到以下内容:calling Golang functions from within javascript code

$.ajax({
  url: "http://www.example.com/signup",
  data: {username: "whatever"} //If the request needs any data 
}).done(function (data) {
  // Do whatever with returned data
});

但是它说的是“ //对返回的数据做任何事情”之类的东西,我对Web编程还是陌生的,所以不知道如何使用该代码。如果要走的路,有人可以在这方面做些扩展吗?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

所以在这里结合不同的概念。

渲染:在对您的html的初始请求中,该请求生成了DropDownList按钮。您的Go服务器会将HTML渲染1次,并将其返回到浏览器。除非您进行连接以更改网页,否则它不会动态重新请求。

客户端:因此,当有人单击您的按钮时,功能Test将被运行。您将希望该功能执行一些操作

  1. 通过ajax,通过api与go服务器通信,该api将以json对象的形式返回连接状态。像

    {   “ 3g”:“ up”,   “ lan”:“下”,   “ wifi”:“上” }

  2. 其次,在ajax的getLANStatus部分中,您将操作DOM中的某些内容以传达接口的状态。您可以通过找到元素,然后将文本更改为对象返回的内容来做到这一点。

作为简单的第一步,您可以在函数中done像这样

alert

然后,如果您要求在Chrome控制台打开的情况下,您将能够直接使用返回的$.ajax({ url: "http://YOUR_GO_SERVER_IP_OR_DNS:PORT/interfaces_status.json" }).done(function (data) { alert(data); console.log(data); debugger; }); 进行播放,从而知道它的所有响应。