为协议缓冲区服务编写客户端程序

时间:2014-01-06 06:56:15

标签: protocol-buffers webservice-client

我在远程计算机上运行的协议缓冲服务说https://website/protobufService 在用户指南中,我只看到消息结构。喜欢 :

message Request {
 required String name = 1;
 required int id = 2,

 ........
}

message Response {
 optional int result =1;
  enum Code {
    val1 = 1;
    val2 = 2;
  } 
 optional Code = 2;
}

我不确定如何用Java编写客户端代码来使用这项服务?

是否有关于为Protobuf服务编写客户端代码的指南?

提前感谢。 - JE

2 个答案:

答案 0 :(得分:1)

Protobufs仅指定如何将消息转换为字节并返回,而不是如何通过网络发送消息。特别是,没有通过HTTP发送protobufs的标准方法。您尝试使用的特定服务的文档需要准确指定它希望如何发送消息。

但是,通常情况下,您会将HTTP POST发送到带有编码Request protobuf作为其正文的URL,并且它将使用编码的Response protobuf进行响应。您应该能够使用任何旧的HTTP库来执行此操作;只需将编码的Request作为字节给出,并将响应字节解码为Response

答案 1 :(得分:1)

我遇到了同样的问题。我已经为我的网络服务编写了下面的客户端。幸运的是它确实返回了输出。不幸的是我认为它不是proto-buf格式。我希望以protobuff格式看到它。我不知道protobuff格式是怎么样的。你可以想看看下面的链接: - https://spring.io/blog/2015/03/22/using-google-protocol-buffers-with-spring-mvc-based-rest-services

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class HttpRestClient {

// http://localhost:8080/customers/
public static void main(String[] args) {

    try {

        URL url = new URL("http://localhost:8080/customers/1");

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-Type", "application/x-protobuf");
        conn.setRequestProperty("Accept", "application/x-protobuf");

        String contentType = conn.getContentType();
        System.out.println(contentType);
        System.out.println("---------------------------------------------------------------------");

        if (conn.getResponseCode() != 200) {
            throw new RuntimeException("Failed : HTTP error code : " + 
conn.getResponseCode());
        }

        BufferedReader br = new BufferedReader(new 
InputStreamReader((conn.getInputStream())));

        String output;
        System.out.println("Output from Server .... \n");
        while ((output = br.readLine()) != null) {
            Object response = output;
            System.out.println(response);
        }

        conn.disconnect();

    } catch (MalformedURLException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    }

}

}

如果有人有更好的建议请知道。这就是我的输出结果: -

应用程序/ x-protobuf的;字符集= UTF-8

服务器输出....

克里斯    理查森*    crichardson@email.com

正如您所看到的,它不是protobuff格式。