当前位置: 首页 > 面试题库 >

从网页访问golang http + jsonrpc

丁弘新
2023-03-14
问题内容

我已经使用Go
net/rpcnet/rpc/jsonrpc打包了一些代码来执行Go进程之间的连接,但是我想知道是否有一种方法可以仅使用标准库中的服务器工具来连接到HTTP
JSONRPC服务器(这不是我编写时遇到的问题)我自己的,只是如果不想的话就不想做)。

这是我的基本服务器设置:

arith := new(server.Arith)

server := rpc.NewServer()
server.Register(arith)

server.HandleHTTP(rpc.DefaultRPCPath, rpc.DefaultDebugPath)

listener, e := net.Listen("tcp", ":4321")
if e != nil {
    log.Fatal("listen error:", e)
}
defer listener.Close()

http.Serve(listener, http.DefaultServeMux)

而且,我希望能够从网页或简单的命令行CURL调用-只需常规POST中就能实现。

但是,此行:http :
//golang.org/src/net/rpc/server.go?s=20445
:
20475#L670似乎表明它希望HTTP客户端发出CONNECT,然后直接编写JSON
RPC向流发送请求并以相同方式接收回复。我不知道这是否可以通过浏览器实现,但是它肯定不像简单的POST那样普遍或兼容。

有没有一种方法可以启动JSON RPC服务器,而我可以使用良好的XMLHttpRequest开机自检?

编辑:废话-上面甚至没有使用jsonrpc的东西-这可能是试图使用Gob,但是无论如何-问题是相同的-src / net / rpc /
server.go中的代码将无法处理POST,因此,无论服务器编解码器如何,此路由总体上都无法工作。


问题答案:

FWIW,我通过制作一个简单的HTTP处理程序使HTTP请求/响应适应ServerCodec来完成此工作。看起来像是一种魅力。

这是工作代码作为测试:

import (
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "net"
    "net/http"
    "net/rpc"
    "net/rpc/jsonrpc"
    "testing"
)

// adapt HTTP connection to ReadWriteCloser
type HttpConn struct {
    in  io.Reader
    out io.Writer
}

func (c *HttpConn) Read(p []byte) (n int, err error)  { return c.in.Read(p) }
func (c *HttpConn) Write(d []byte) (n int, err error) { return c.out.Write(d) }
func (c *HttpConn) Close() error                      { return nil }

// our service
type CakeBaker struct{}

func (cb *CakeBaker) BakeIt(n int, msg *string) error {
    *msg = fmt.Sprintf("your cake has been bacon (%d)", n)
    return nil
}

func TestHTTPServer(t *testing.T) {

    fmt.Printf("TestHTTPServer\n")

    cb := &CakeBaker{}

    server := rpc.NewServer()
    server.Register(cb)

    listener, e := net.Listen("tcp", ":4321")
    if e != nil {
        log.Fatal("listen error:", e)
    }
    defer listener.Close()

    go http.Serve(listener, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        if r.URL.Path == "/bake-me-a-cake" {
            serverCodec := jsonrpc.NewServerCodec(&HttpConn{in: r.Body, out: w})
            w.Header().Set("Content-type", "application/json")
            w.WriteHeader(200)
            err := server.ServeRequest(serverCodec)
            if err != nil {
                log.Printf("Error while serving JSON request: %v", err)
                http.Error(w, "Error while serving JSON request, details have been logged.", 500)
                return
            }
        }

    }))

    resp, err := http.Post("http://localhost:4321/bake-me-a-cake", "application/json", bytes.NewBufferString(
        `{"jsonrpc":"2.0","id":1,"method":"CakeBaker.BakeIt","params":[10]}`,
    ))
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    fmt.Printf("returned JSON: %s\n", string(b))

}


 类似资料:
  • 问题内容: 好的,我有一个页面,在此页面上有一个iframe。我需要做的是在iframe页面上,找出主页的URL。 我进行了搜索,我知道如果我的iframe页面位于其他域上是不可能的,因为这是跨站点脚本。但是,我读过的所有内容都说,如果iframe页面与父页面位于同一域中,那么例如,它应该可以工作: …或其他类似的组合,因为似乎有多种获取相同信息的方法。 无论如何,这就是问题所在。我的iframe

  • 本文向大家介绍Android通过访问网页查看网页源码实例详解,包括了Android通过访问网页查看网页源码实例详解的使用技巧和注意事项,需要的朋友参考一下 Android通过访问网页查看网页源码 1.添加网络权限 2.获取网络中网页的数据 3.处理查看网页源码的控制 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 我需要从endpoint获取一些数据,然后根据响应将这些数据存储到数据库中。

  • 我家中做了个 all in one 的小主机,安装了 esxi8.0系统,其中安装了 openWrt,win7,centos 之前是电信送的猫做路由器,我现在联系了电信更改了模式,在 openWrt 中拨号上网,看下图已经拨号成功,并且家中电视机已经可以正常看在线视频了。同时我修改了 openWrt 的管理页面的访问端口为7070,不过我在家中局域网访问 openWrt 仍然可以通过 http:/

  • 问题内容: 如何通过JavaScript访问页面的HTTP响应标头? 问题答案: 不幸的是,没有一个API可以为你的初始页面请求提供HTTP响应标头。那是这里发布的原始问题。也有人反复询问,因为有些人想获得原始页面请求的实际响应头,而不发出另一个请求。 对于AJAX请求: 如果通过AJAX发出HTTP请求,则可以使用getAllResponseHeaders()方法获取响应标头。它是XMLHttp

  • 问题内容: 我的网站上有一个PHP页面,该页面从数据库中检索数据以显示在我的网站中。该页面通过AJAX调用。我该如何限制仅从我网站上的页面访问它,以便想要滥用它 而不 从网站(例如从其服务器发布HTTP请求)中获取该数据的用户本身无法这样做? 问题答案: 由于XHR的同源策略,在另一个站点上运行的JavaScript将无法访问您的站点。但是,没有什么能阻止某人构建PHP + CURL脚本来“代理”