HTTP 调用
rpcx服务器何以通过HTTP访问。HTTP服务器的头部与访问gateway的方法的头部一样。
显然,通过HTTP访问不能达到通过TCP/UDP访问的高效率,但是你可以很容易的使用跨语言开发使用它。
你可以使用你熟悉的编程语言来编写一个http客户端来直接访问rpcx服务。http body的请求和响应可以任意使用,不过有一些额外的头上必须添加到HTTP头部中,这样rpcx服务就可以解析服务和方法。
以下是一个例程:
func main() {
cc := &codec.MsgpackCodec{}
args := &Args{
A: 10,
B: 20,
}
data, _ := cc.Encode(args)
req, err := http.NewRequest("POST", "http://127.0.0.1:8972/", bytes.NewReader(data))
if err != nil {
log.Fatal("failed to create request: ", err)
return
}
h := req.Header
h.Set(gateway.XMessageID, "10000")
h.Set(gateway.XMessageType, "0")
h.Set(gateway.XSerializeType, "3")
h.Set(gateway.XServicePath, "Arith")
h.Set(gateway.XServiceMethod, "Mul")
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal("failed to call: ", err)
}
defer res.Body.Close()
// handle http response
replyData, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatal("failed to read response: ", err)
}
reply := &Reply{}
err = cc.Decode(replyData, reply)
if err != nil {
log.Fatal("failed to decode reply: ", err)
}
log.Printf("%d * %d = %d", args.A, args.B, reply.C)
}