2010-07-06 7 views
1

J'essaie d'implémenter des tampons de protocole pour client/serveur en utilisant REST. Je suis encore un peu confus si j'ai besoin d'envoyer une requête de tampons de protocole au format octet?Envoi de tampons de protocole via REST

Je veux dire, dans mon code client, ai-je besoin de sérialiser l'objet en tableau d'octets? Par exemple

protoRequest.build.toByteArray()

Et dans le serveur, dois-je c

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

Est-ce la bonne chose à faire?

Merci

David

Répondre

0

Vous pouvez coder le résultat de SerializeToString utilisant base64.

1

Vous pouvez utiliser un flux d'entrée à cette fin. Serveur Code Side sera ressembler le code ci-dessous

@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(); 

} 

côté client ressemblera à ceci:

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

Vos liens de blog ne * pas * répondre à la question posée à tous, et vous ne parvenez pas à divulguer que était votre propre article de blog que vous liez à. J'ai enlevé les liens. –

+0

Mon blog contient les détails de configuration de base pour l'envoi et la réception de données dans google protocol bufer via le service Web. J'ai fait de la R & D sur ce sujet pendant 2 jours puis j'ai pu trouver une solution et je l'ai mise dans mon blog. Cette question était similaire au contenu de mon blog et les changements que j'ai requis pour résoudre cette question que j'ai faite et vous pouvez vérifier vous-même en l'implémentant. –

+1

La question est "voici mon code, est-ce la bonne chose à faire?" Vous ne dites nulle part «oui» ou «non», et votre article ne tente même pas de répondre à la question. Il peut s'agir d'un sujet «similaire», mais il n'est pas approprié de lier votre blog de cette manière. Vous avez l'URL de votre blog dans votre profil - c'est là que les gens peuvent le voir et visiter votre blog. Stack Overflow n'est pas là pour vous aider à promouvoir votre blog. –

1

J'ai écrit un Step by Step tutorial sur la façon de produire/consommer un flux tampon de protocole dans un service Web , en utilisant Jersey comme implémentation du client JAX-RS. J'espère que ça t'aidera. :)

côté serveur:

@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(); 
} 

côté client:

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)); 
Questions connexes