POST HTTP utilizando JSON en Java

Me gustaría hacer un HTTP POST simple usando JSON en Java.

Digamos que la URL es www.site.com

y toma el valor {"name":"myname","age":"20"} etiquetado como 'details' por ejemplo.

¿Cómo voy a crear la syntax para el POST?

Tampoco puedo encontrar un método POST en JSON Javadocs.

Aquí está lo que tú necesitas hacer:

  1. Obtenga Apache HttpClient, esto le permitiría hacer la solicitud requerida
  2. Cree una solicitud de HttpPost con ella y agregue el encabezado “application / x-www-form-urlencoded”
  3. Cree un StringEntity que le pasará JSON
  4. Ejecuta la llamada

El código se parece más o menos (todavía tendrá que depurarlo y hacerlo funcionar)

 //Deprecated //HttpClient httpClient = new DefaultHttpClient(); HttpClient httpClient = HttpClientBuilder.create().build(); //Use this instead try { HttpPost request = new HttpPost("http://yoururl"); StringEntity params =new StringEntity("details={\"name\":\"myname\",\"age\":\"20\"} "); request.addHeader("content-type", "application/x-www-form-urlencoded"); request.setEntity(params); HttpResponse response = httpClient.execute(request); //handle response here... }catch (Exception ex) { //handle exception here } finally { //Deprecated //httpClient.getConnectionManager().shutdown(); } 

Puede hacer uso de la biblioteca Gson para convertir sus clases de Java a objetos JSON.

Crea una clase pojo para las variables que deseas enviar como se muestra arriba Ejemplo

 {"name":"myname","age":"20"} 

se convierte

 class pojo1 { String name; String age; //generate setter and getters } 

una vez que estableces las variables en la clase pojo1 puedes enviar eso usando el siguiente código

 String postUrl = "www.site.com";// put in your url Gson gson = new Gson(); HttpClient httpClient = HttpClientBuilder.create().build(); HttpPost post = new HttpPost(postUrl); StringEntity postingString = new StringEntity(gson.toJson(pojo1));//gson.tojson() converts your pojo to json post.setEntity(postingString); post.setHeader("Content-type", "application/json"); HttpResponse response = httpClient.execute(post); 

y estas son las importaciones

 import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; 

y para GSON

 import com.google.gson.Gson; 

La respuesta de @Momo para Apache HttpClient, versión 4.3.1 o posterior. Estoy usando JSON-Java para construir mi objeto JSON:

 JSONObject json = new JSONObject(); json.put("someKey", "someValue"); CloseableHttpClient httpClient = HttpClientBuilder.create().build(); try { HttpPost request = new HttpPost("http://yoururl"); StringEntity params = new StringEntity(json.toString()); request.addHeader("content-type", "application/json"); request.setEntity(params); httpClient.execute(request); // handle response here... } catch (Exception ex) { // handle exception here } finally { httpClient.close(); } 

Probablemente sea más fácil usar HttpURLConnection .

http://www.xyzws.com/Javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139

Utilizará JSONObject o lo que sea para construir su JSON, pero no para manejar la red; necesita serializarlo y luego pasarlo a HttpURLConnection para POST.

 protected void sendJson(final String play, final String prop) { Thread t = new Thread() { public void run() { Looper.prepare(); //For Preparing Message Pool for the childThread HttpClient client = new DefaultHttpClient(); HttpConnectionParams.setConnectionTimeout(client.getParams(), 1000); //Timeout Limit HttpResponse response; JSONObject json = new JSONObject(); try { HttpPost post = new HttpPost("http://192.168.0.44:80"); json.put("play", play); json.put("Properties", prop); StringEntity se = new StringEntity(json.toString()); se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); post.setEntity(se); response = client.execute(post); /*Checking response */ if (response != null) { InputStream in = response.getEntity().getContent(); //Get the data in the entity } } catch (Exception e) { e.printStackTrace(); showMessage("Error", "Cannot Estabilish Connection"); } Looper.loop(); //Loop in the message queue } }; t.start(); } 

Prueba este código:

 HttpClient httpClient = new DefaultHttpClient(); try { HttpPost request = new HttpPost("http://yoururl"); StringEntity params =new StringEntity("details={\"name\":\"myname\",\"age\":\"20\"} "); request.addHeader("content-type", "application/json"); request.addHeader("Accept","application/json"); request.setEntity(params); HttpResponse response = httpClient.execute(request); // handle response here... }catch (Exception ex) { // handle exception here } finally { httpClient.getConnectionManager().shutdown(); } 

Encontré esta pregunta en busca de una solución sobre cómo enviar una solicitud posterior del cliente de Java a Google Endpoints. Las respuestas anteriores, muy probablemente sean correctas, pero no funcionarán en el caso de Google Endpoints.

Solución para Google Endpoints.

  1. El cuerpo de la solicitud debe contener solo cadena JSON, no nombre = par de valores.
  2. El encabezado del tipo de contenido debe establecerse en “application / json”.

     post("http://localhost:8888/_ah/api/langapi/v1/createLanguage", "{\"language\":\"russian\", \"description\":\"dsfsdfsdfsdfsd\"}"); public static void post(String url, String param ) throws Exception{ String charset = "UTF-8"; URLConnection connection = new URL(url).openConnection(); connection.setDoOutput(true); // Triggers POST. connection.setRequestProperty("Accept-Charset", charset); connection.setRequestProperty("Content-Type", "application/json;charset=" + charset); try (OutputStream output = connection.getOutputStream()) { output.write(param.getBytes(charset)); } InputStream response = connection.getInputStream(); } 

    Seguro que se puede hacer usando HttpClient también.

Recomiendo http-request basado en apache http api.

 HttpRequest httpRequest = HttpRequestBuilder.createPost(yourUri, String.class) .responseDeserializer(ResponseDeserializer.ignorableDeserializer()).build(); public void send(){ ResponseHandler responseHandler = httpRequest.execute("details", yourJsonData); int statusCode = responseHandler.getStatusCode(); String responseContent = responseHandler.orElse(null); // returns Content from response. If content isn't present returns null. } 

Si desea enviar JSON como cuerpo de solicitud, puede:

  ResponseHandler responseHandler = httpRequest.executeWithBody(yourJsonData); 

Recomiendo encarecidamente leer la documentación antes de su uso.