golang http jsonrpc从网页访问

前端之家收集整理的这篇文章主要介绍了golang http jsonrpc从网页访问前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经使用Go的net / rpc和net / rpc / jsonrpc包来执行Go进程之间的连接,但是我想知道是否有一种方法只使用标准库中的服务器工具连接到HTTP JSONRPC服务器(不是我写自己的问题,如果我不需要,就不想这样做).

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

  1. arith := new(server.Arith)
  2.  
  3. server := rpc.NewServer()
  4. server.Register(arith)
  5.  
  6. server.HandleHTTP(rpc.DefaultRPCPath,rpc.DefaultDebugPath)
  7.  
  8. listener,e := net.Listen("tcp",":4321")
  9. if e != nil {
  10. log.Fatal("listen error:",e)
  11. }
  12. defer listener.Close()
  13.  
  14. 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来POST?

编辑:废话 – 上面甚至没有使用jsonrpc的东西 – 这可能是尝试使用Gob,但无论如何 – 问题是相同的 – src / net / rpc / server.go中的代码不会处理POST,所以无论服务器编解码器如何,这条路线总体上都无法运行.

FWIW,我通过制作一个简单的HTTP处理程序来调整服务器IDC的程序.似乎像魅力一样工作.

这是作为测试的工作代码

  1. import (
  2. "bytes"
  3. "fmt"
  4. "io"
  5. "io/IoUtil"
  6. "log"
  7. "net"
  8. "net/http"
  9. "net/rpc"
  10. "net/rpc/jsonrpc"
  11. "testing"
  12. )
  13.  
  14. // adapt HTTP connection to ReadWriteCloser
  15. type HttpConn struct {
  16. in io.Reader
  17. out io.Writer
  18. }
  19.  
  20. func (c *HttpConn) Read(p []byte) (n int,err error) { return c.in.Read(p) }
  21. func (c *HttpConn) Write(d []byte) (n int,err error) { return c.out.Write(d) }
  22. func (c *HttpConn) Close() error { return nil }
  23.  
  24. // our service
  25. type CakeBaker struct{}
  26.  
  27. func (cb *CakeBaker) BakeIt(n int,msg *string) error {
  28. *msg = fmt.Sprintf("your cake has been bacon (%d)",n)
  29. return nil
  30. }
  31.  
  32. func TestHTTPServer(t *testing.T) {
  33.  
  34. fmt.Printf("TestHTTPServer\n")
  35.  
  36. cb := &CakeBaker{}
  37.  
  38. server := rpc.NewServer()
  39. server.Register(cb)
  40.  
  41. listener,":4321")
  42. if e != nil {
  43. log.Fatal("listen error:",e)
  44. }
  45. defer listener.Close()
  46.  
  47. go http.Serve(listener,http.HandlerFunc(func(w http.ResponseWriter,r *http.Request) {
  48.  
  49. if r.URL.Path == "/bake-me-a-cake" {
  50. serverCodec := jsonrpc.NewServerCodec(&HttpConn{in: r.Body,out: w})
  51. w.Header().Set("Content-type","application/json")
  52. w.WriteHeader(200)
  53. err := server.ServeRequest(serverCodec)
  54. if err != nil {
  55. log.Printf("Error while serving JSON request: %v",err)
  56. http.Error(w,"Error while serving JSON request,details have been logged.",500)
  57. return
  58. }
  59. }
  60.  
  61. }))
  62.  
  63. resp,err := http.Post("http://localhost:4321/bake-me-a-cake","application/json",bytes.NewBufferString(
  64. `{"jsonrpc":"2.0","id":1,"method":"CakeBaker.BakeIt","params":[10]}`,))
  65. if err != nil {
  66. panic(err)
  67. }
  68. defer resp.Body.Close()
  69. b,err := IoUtil.ReadAll(resp.Body)
  70. if err != nil {
  71. panic(err)
  72. }
  73.  
  74. fmt.Printf("returned JSON: %s\n",string(b))
  75.  
  76. }

猜你在找的Go相关文章