Cómo utilizar parámetros con HttpPost

Estoy utilizando un RESTfull webservice con este methode:

@POST @Consumes({"application/json"}) @Path("create/") public void create(String str1, String str2){ System.out.println("value 1 = " + str1); System.out.println("value 2 = " + str2); } 

En mi aplicación de Android quiero llamar a este método. ¿Cómo doy los valores correctos a los parámetros usando org.apache.http.client.methods.HttpPost;

He notado que puedo utilizar la anotación @HeaderParam y simplemente añadir cabeceras al objeto HttpPost. ¿Es esta la forma correcta? Hacerlo como:

 httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("str1", "a value"); httpPost.setHeader("str2", "another value"); 

El uso del método setEntity en httpPost no funcionará. Sólo establece el parámetro str1 con la cadena json. Al usarlo como:

 JSONObject json = new JSONObject(); json.put("str1", "a value"); json.put("str2", "another value"); HttpEntity e = new StringEntity(json.toString()); httpPost.setEntity(e); //server output: value 1 = {"str1":"a value","str2":"another value"} 

Para establecer los parámetros de su HttpPostRequest puede utilizar BasicNameValuePair , algo así:

  HttpClient httpclient; HttpPost httppost; ArrayList<NameValuePair> postParameters; httpclient = new DefaultHttpClient(); httppost = new HttpPost("your login link"); postParameters = new ArrayList<NameValuePair>(); postParameters.add(new BasicNameValuePair("param1", "param1_value")); postParameters.add(new BasicNameValuePair("param2", "param2_value")); httpPost.setEntity(new UrlEncodedFormEntity(postParameters, "UTF-8")); HttpResponse response = httpclient.execute(httpPost); 

En general, un HTTP POST asume que el contenido del cuerpo contiene una serie de pares clave / valor que se crean (generalmente) por un formulario en el lado HTML. No establece los valores mediante setHeader, ya que no los colocará en el cuerpo de contenido.

Así que con su segunda prueba, el problema que tiene aquí es que su cliente no está creando múltiples pares clave / valor, sólo creó uno y que se asignó por defecto al primer argumento en su método.

Hay un par de opciones que puede utilizar. En primer lugar, puede cambiar su método para aceptar sólo un parámetro de entrada y, a continuación, pasar una cadena JSON como lo hace en su segunda prueba. Una vez dentro del método, analiza la cadena JSON en un objeto que permitiría el acceso a los campos.

Otra opción es definir una clase que representa los campos de los tipos de entrada y hacer que el único parámetro de entrada. Por ejemplo

 class MyInput { String str1; String str2; public MyInput() { } // getters, setters } @POST @Consumes({"application/json"}) @Path("create/") public void create(MyInput in){ System.out.println("value 1 = " + in.getStr1()); System.out.println("value 2 = " + in.getStr2()); } 

Dependiendo del marco REST que esté utilizando, debe manejar la des-serialización del JSON para usted.

La última opción es construir un cuerpo POST que se vea así:

 str1=value1&str2=value2 

A continuación, agregue algunas anotaciones adicionales a su método de servidor:

 public void create(@QueryParam("str1") String str1, @QueryParam("str2") String str2) 

@QueryParam no le importa si el campo está en una publicación de formulario o en la URL (como una consulta GET).

Si desea seguir utilizando argumentos individuales en la entrada, entonces la clave es generar la solicitud del cliente para proporcionar parámetros de consulta con nombre, ya sea en la URL (para un GET) o en el cuerpo del POST.

También puede utilizar este enfoque en caso de que desee pasar algunos parámetros http y enviar una solicitud de json:

(Nota: he añadido en algún código extra sólo en caso de que ayuda a cualquier otro lector futuro)

 public void postJsonWithHttpParams() throws URISyntaxException, UnsupportedEncodingException, IOException { //add the http parameters you wish to pass List<NameValuePair> postParameters = new ArrayList<>(); postParameters.add(new BasicNameValuePair("param1", "param1_value")); postParameters.add(new BasicNameValuePair("param2", "param2_value")); //Build the server URI together with the parameters you wish to pass URIBuilder uriBuilder = new URIBuilder("http://google.ug"); uriBuilder.addParameters(postParameters); HttpPost postRequest = new HttpPost(uriBuilder.build()); postRequest.setHeader("Content-Type", "application/json"); //this is your JSON string you are sending as a request String yourJsonString = "{\"str1\":\"a value\",\"str2\":\"another value\"} "; //pass the json string request in the entity HttpEntity entity = new ByteArrayEntity(yourJsonString.getBytes("UTF-8")); postRequest.setEntity(entity); //create a socketfactory in order to use an http connection manager PlainConnectionSocketFactory plainSocketFactory = PlainConnectionSocketFactory.getSocketFactory(); Registry<ConnectionSocketFactory> connSocketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() .register("http", plainSocketFactory) .build(); PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(connSocketFactoryRegistry); connManager.setMaxTotal(20); connManager.setDefaultMaxPerRoute(20); RequestConfig defaultRequestConfig = RequestConfig.custom() .setSocketTimeout(HttpClientPool.connTimeout) .setConnectTimeout(HttpClientPool.connTimeout) .setConnectionRequestTimeout(HttpClientPool.readTimeout) .build(); // Build the http client. CloseableHttpClient httpclient = HttpClients.custom() .setConnectionManager(connManager) .setDefaultRequestConfig(defaultRequestConfig) .build(); CloseableHttpResponse response = httpclient.execute(postRequest); //Read the response String responseString = ""; int statusCode = response.getStatusLine().getStatusCode(); String message = response.getStatusLine().getReasonPhrase(); HttpEntity responseHttpEntity = response.getEntity(); InputStream content = responseHttpEntity.getContent(); BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); String line; while ((line = buffer.readLine()) != null) { responseString += line; } //release all resources held by the responseHttpEntity EntityUtils.consume(responseHttpEntity); //close the stream response.close(); // Close the connection manager. connManager.close(); } 
  • JDBC vs Servicio Web para Android
  • Cómo rellenar el diseño de la tabla con la cadena JSON
  • SOAP xml a cambio - Android
  • Bloquear usuarios no Android que llaman al servicio JSON
  • Recomendaciones para el formato / protocolo de .NET Web Service para Android, iPhone, etc.
  • Cuál es el papel de la clave de la aplicación y la clave secreta en cada SDK
  • Retrofit 2: enviar archivos con el objeto json
  • ProgressDialog o ProgressBar ralentiza la aplicación que ejecuta Android 4.1
  • ¿Cómo funciona la sincronización de datos y cómo la uso en aplicaciones cliente-servidor?
  • Ksoap2 casting getResponse ()
  • SoapFault - código de error: 'soap: Server' faultstring: 'System.Web.Services.Protocols.SoapException:
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.