Como reduzir número de request http

6 respostas Resolvido
javarest
_

Gostaria de sugestões de como posso reduzir o numero de requisições http.
A situação atual do lado Client é a seguinte:

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
{.....}
      private void testAdd() throws InterruptedException{
   
      Form form = new Form();

      form.param("param1", "111");
      form.param("param2", "22222");
      form.param("param3", "33333");
      form.param("param4", "4444");
      form.param("param5", "55");
      form.param("param6", "666");
      form.param("param7", "ma");
      form.param("param8", "8");
      form.param("param9", "N");
      form.param("param10", "observacao");
      form.param("param11", "condicao");
      form.param("param12", "porta");
      form.param("param13", "13");

      String callResult = client
         .target(REST_SERVICE_URL)
         .request(MediaType.APPLICATION_XML)
         .put(Entity.entity(form,
            MediaType.APPLICATION_FORM_URLENCODED_TYPE),
            String.class);
   
   }

A situação do lado Server é a seguinte:

import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
{......}

@PUT
@Path("/caminho")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createVenda(

		@FormParam("param1") int param1,
		@FormParam("param2") int param2,
		@FormParam("param3") int param3,
		@FormParam("param4") int param4,
		@FormParam("param5") double param5,
		@FormParam("param6") double param6,
		@FormParam("param7") String param7,
		@FormParam("param8") int param8,
		@FormParam("param9") String param9,
		@FormParam("param10") String param10,
		@FormParam("param11") String param11,
		@FormParam("param12") String param12,
		@FormParam("param13") int param13,
		@Context HttpServletResponse servletResponse,
		@Context Request request) throws IOException{
	
	Venda venda = new Venda(

			param1,
			param2,
			param3,
			param4,
			param5,
			param6,
			param7,
			param8,
			param9,
			param10,
			param11,
			param12,
			param13
			);
	
	EntityTag etag = new EntityTag(Integer.toString(venda.hashCode()));
    ResponseBuilder builder = request.evaluatePreconditions(etag);
    
    if(builder != null){
        return builder.build();
    }
    
	vendaDao.addVenda(venda);
	
	builder = Response.noContent();
    return builder.build();
}

Se eu precisar enviar 200 itens, serão 200 requisições em que apenas tem diferença no valor dos parâmetros passados, se eu conseguisse passar uma especie de List e tratar isto no lado servidor seria mais interessante, eu acredito.

Sugestões?

6 Respostas

J

Informe o que você está usando. Se for jersey, posta um json, assim você pode passar uma estrutura de objetos do jeito que quiser, podendo ter listas.

_

Não estou utilizando Jersey, estou utilizando javax.ws.rs. Os xmls são gerados baseados no modelo de dados que é anotado utilizando javax.xml.bind.annotation.

J

Já pesquisou a possibilidade de usar json com a tecnologia que você usa?

N

Você pode substituir todos esses parâmetros por um objeto, e passar o objeto nas requisições. Você precisa apenas fazer a serialização e desserialização. Como você está usando XML, use a biblioteca xstream, é melhor do que fazer na unha. Se tiver que passar um alista desses objetos, também será possível, abraços.

_

O xstream consegue gerar uma estrutura como eu preciso, parecida com esta abaixo:

<VENDA>
 <DATA>1990</DATA>
 <NOME>MANFRED</NOME>
 <BONIFICACAO>N</BONIFICACAO>
 <CONDICAO>10</CONDICAO>
 <DESCONTO>0.0</DESCONTO>
 <OBSERVACAO> observação</OBSERVACAO>
	
  <ITENS>
  	<item>
	  	<CODPROD>3672</CODPROD>
	  	<DESCONTO>5.0</DESCONTO>
	  	<NUMDOC>64</NUMDOC>
	  	<QUANTIDADE>3.0</QUANTIDADE>
	  	<TOTAL>77.04</TOTAL>
	  	<VLRUNIT>77.04</VLRUNIT>
	  	<VLRVENDA>77.04</VLRVENDA>
  	</item>
  	<item>
	  	<CODPROD>3667</CODPROD>
	  	<DESCONTO>0.0</DESCONTO>
	  	<QUANTIDADE>12.0</QUANTIDADE>
	  	<TOTAL>114.0</TOTAL>
	  	<VLRUNIT>114.0</VLRUNIT>
	  	<VLRVENDA>114.0</VLRVENDA>
	</item>
	.
	.
	.
    
  </ITENS>
</VENDA>

Vou tentar com outros maneiras, pois até o momento utilizei apenas form e o mediatype para form. Ainda não sei como utilizar os outros, mas acho que deve ser o caminho.

String callResult = client
         .target(REST_SERVICE_URL)
         .request(MediaType.APPLICATION_XML)
         .put(Entity.entity(form,
            MediaType.APPLICATION_FORM_URLENCODED_TYPE),
            String.class);
_
Solucao aceita

Basicamentee consegui resolver o problema ajustando os MediaType e tanto do serviço quanto do cliente.

Serviço:

@POST
    @Path("/create")
    @Consumes(MediaType.APPLICATION_XML)
    public Response Create(Country imput){
{...}
}

Cliente:

Response callResult = client.target(REST_SERVICE_URL)
.request(MediaType.APPLICATION_XML)
.post(Entity.entity(country, MediaType.APPLICATION_XML));

No exemplo acima basicamente o que faço é popular um objeto do meu modelo de dados devidamente anotado e enviar o mesmo para o meu serviço que faz as operações necessárias.
O “segredo” está em utilizar o par certo de parametro e mediatype na requisição e no serviço, com isto pode se utilizar texto simples, json, xml, form, entre outros.

Criado 2 de setembro de 2017
Ultima resposta 8 de set. de 2017
Respostas 6
Participantes 3