Como reduzir número de request http

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?

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á pesquisou a possibilidade de usar json com a tecnologia que você usa?

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

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.