大猩猩/rpc JSON RPC服务无响应

3

我正在研究使用Gorilla Web Toolkit创建一个简单的RPC API。我正在使用其文档中提供的示例,并且正在使用Chrome浏览器中的Advanced Rest Client进行测试。

http://localhost:1111/api/ 

并POST以下原始JSON有效负载:

{"method":"HelloService.Say","params":[{"Who":"Test"}]}

这个请求已经到达服务器,我知道这一点是因为我正在记录它(请参见下面的代码),并且我收到了200 OK响应。然而,我得到了“响应不包含任何数据”的错误信息。

我期望得到在下面的Say方法中定义的JSON回复消息。有没有人对问题有什么建议?

package main

import (
    "gorilla/mux"
    "gorilla/rpc"
    "gorilla/rpc/json"
    "log"
    "net/http"
)  

type HelloArgs struct {
    Who string
}

type HelloReply struct {
    Message string
}

type HelloService struct{}

func (h *HelloService) Say(r *http.Request, args *HelloArgs, reply *HelloReply) error {
    log.Printf(args.Who)
    reply.Message = "Hello, " + args.Who + "!"
    log.Printf(reply.Message)
    return nil
}

func main() {
    r := mux.NewRouter()    
    jsonRPC := rpc.NewServer()
    jsonCodec := json.NewCodec()
    jsonRPC.RegisterCodec(jsonCodec, "application/json")
    jsonRPC.RegisterCodec(jsonCodec, "application/json; charset=UTF-8") // For firefox 11 and other browsers which append the charset=UTF-8
    jsonRPC.RegisterService(new(HelloService), "")
    r.Handle("/api/", jsonRPC)  
    http.ListenAndServe(":1111", r)
}

1
  1. 缩进你的代码
  2. 检查返回的错误
  3. 再试一次
- thwd
你最终解决了这个问题吗? - rem7
1个回答

6
因为gorilla/rpc/json实现了JSON-RPC,该协议要求请求中包含三个参数:methodparamsid
在JSON-RPC中没有id的请求被称为通知,并且没有响应。
请查看规范以获取更多详细信息。
因此,在您的情况下,您需要使用以下JSON:
{"method":"HelloService.Say","params":[{"Who":"Test"}], "id":"1"}

即使我们错过了id,我们也会得到200 OK的响应,但是响应体中没有JSON。谢谢你的回答。 :) - Naren Yellavula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接