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)
}

results matching ""

    No results matching ""