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;
- Introduce datos en la base de datos desde la aplicación de Android a través del servicio web.
- Cómo utilizar la sesión para trabajar entre php webservices y android
- ¿Qué authTokenType significa exactamente?
- Comprobación de la disponibilidad del servicio web en android
- Envío de SQLite db al servicio web
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"}
- ¿Es posible ejecutar un servidor Tomcat y algunas aplicaciones web en un dispositivo Android? (es decir, un comprimido)
- Enfoque de diseño: android and web service
- Autenticación de Facebook para el servicio JSON con la aplicación Android
- Diferentes formas de publicar valores json en Server
- No se pueden serializar las fechas con ksoap2
- Solicitudes seguras de servicio web
- Android: ¿Cómo enviar datos a MySQL DB sin usar JDBC, PHP o cualquier otro servicio web?
- Datos de servicio web de caché de android
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(); }
- Desactivar oscurecimiento oscuro en el cajón de navegación
- Cómo utilizar el comando adb para empujar un archivo en el dispositivo sin tarjeta sd