2010-07-06 2 views
1

Я пытаюсь реализовать буферы протокола для клиента/сервера, используя REST. Я все еще немного смущен, если мне нужно отправить запрос буферов протокола в формат байта?Отправка буферов протокола через REST

Я имею в виду, в моем клиентском коде мне нужно сериализовать объект в массив байтов? Например

protoRequest.build.toByteArray()

А на сервере, мне нужно с

@POST 
    @Consumes("application/octet-stream") 
    public byte[] processProtoRequest(byte[] protoRequest) { 
    ProtoRequest.Builder request = ProtoRequest.newBuilder(); 
    request.mergeFrom(protoRequest) 
} 

Является ли это правильно делать?

Благодаря

David

ответ

0

Вы можете кодировать результат SerializeToString с использованием base64.

1

Вы можете использовать поток ввода для этой цели. На стороне сервера код будет выглядеть следующим кодом

@POST 
public Response processProtoRequest(@Context HttpServletRequest req) { 
      ProtoRequest protoRequestObj = ProtoRequest.parseFrom(req.getInputStream()); 
      ///process protoRequestObj and convert into byte arry and send to clinet 
      return Response.ok(protoRequestObj.toByteArray(), 
         MediaType.APPLICATION_OCTET_STREAM).status(200).build(); 

} 

стороне клиента будет выглядеть следующим образом:

ProtoRequest protoRequestObj = ProtoRequest.newBuilder(). //protocol buffer object 
      setSessionId(id). 
      setName("l070020"). 
      build(); 

     DefaultHttpClinet httpClinet = new DefaultHttpClinet(); 
     HttpPost request = new HttpPost("http://localhost:8080/maven.work/service/mainServices/protoRequest"); 
    request.addHeader("accept","application/octet-stream"); 
    request.setEntity(protoRequestObj.toByteArray()); 
    HttpResponse response = httpClient.execute(request); 
+1

Ваш блог ссылки * не * решить вопрос, заданный на всех, и вы не в состоянии раскрыть, что оно был вашим собственным сообщением в блоге, с которым вы связывались. Я удалил ссылки. –

+0

В моем блоге содержатся основные данные настройки для отправки и получения данных в bufer-протоколе Google через веб-службу. Я занимался R & D по этой проблеме в течение 2 дней, после чего мне удалось найти решение, и я вложил его в свой блог. Этот вопрос был похож на содержание моего блога и изменения, которые я требовал для решения этого вопроса, который я сделал, и вы можете проверить свое «я», выполнив его. –

+1

Вопрос в том, «вот мой код, это правильная вещь?» Нигде вы не говорите «да» или «нет», и ваш пост в блоге даже не пытается решить вопрос. Это может быть в «аналогичной» теме, но не обязательно ссылаться на ваш блог. У вас есть URL вашего блога в вашем профиле - здесь люди могут видеть его и посещать ваш блог. Stack Overflow не здесь, чтобы помочь вам рекламировать свой блог. –

1

Я написал Step by Step tutorial о том, как производить/потреблять поток буфера протокола в веб-службы , используя Джерси в качестве реализации JAX-RS клиента. Надеюсь, это поможет вам. :)

стороне сервера:

@GET 
@Path("/{galaxy}") 
@Consumes(MediaType.TEXT_HTML) 
@Produces(MediaType.APPLICATION_OCTET_STREAM) 
public Response getInfo(@PathParam("galaxy") String galaxyName){ 

    if(StringUtils.equalsIgnoreCase("MilkyWay", StringUtils.remove(galaxyName, ' '))){ 

     // The following method would call the DTO Galaxy builders. 
     Galaxy milkyWay = MilkyWayFactory.createGalaxy(); 

     // This is the important line for you where where the generated toByteArray() method takes responsibility of serializing the instance into a Protobuf format stream 
     return Response.ok(milkyWay.toByteArray(),MediaType.APPLICATION_OCTET_STREAM).status(200).build(); 
    } 

    return Response.status(Status.NOT_FOUND).build(); 
} 

стороне клиента:

String serverContext = "learning-protobuf3-ws-service"; 
String servicePath = "ws/universe/milkyway"; 
String serviceHost = "localhost"; 
Integer servicePort = 8080; 

javax.ws.rs.client.Client client = javax.ws.rs.client.ClientBuilder.newClient(); 

javax.ws.rs.client.WebTarget target = client.target("http://"+serviceHost+":"+servicePort+"/"+serverContext) 
              .path(servicePath); 


InputStream galaxyByteString = target.request(MediaType.TEXT_HTML) 
     .header("accept",MediaType.APPLICATION_OCTET_STREAM) 
     .get(InputStream.class); 

Galaxy galaxy = Galaxy.parseFrom(IOUtils.toByteArray(galaxyByteString)); 
Смежные вопросы