Poste HTTP utilisant JSON en Java

je voudrais faire un simple POST HTTP en utilisant JSON en Java.

disons que l'URL est www.site.com

et il prend la valeur {"name":"myname","age":"20"} marquée comme 'details' par exemple.

comment créer la syntaxe pour le POST?

Je n'arrive pas non plus à trouver de méthode de POST dans les Javadocs JSON.

145
demandé sur cricket_007 2011-08-25 00:01:29

8 réponses

Voici ce que vous devez faire:

  1. Apache HttpClient, cela vous permettrait de faire la demande requis
  2. créer une requête HttpPost avec elle et ajouter l'en-tête "application / x-www-form-urlencoded "
  3. créer une entité de chaîne de caractères que vous passerez à JSON
  4. exécuter l'appel

le code ressemble à peu près (vous aurez encore besoin de déboguer il et de le faire fonctionner)

//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(); 
}
139
répondu momo 2016-12-29 21:48:38

vous pouvez utiliser la bibliothèque Gson pour convertir vos classes java en objets JSON.

Créer une classe pojo pour les variables que vous souhaitez envoyer comme dans L'exemple ci-dessus

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

devient

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

une fois que vous avez défini les variables dans la classe pojo1 vous pouvez envoyer cela en utilisant le code suivant

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

et ce sont les importations

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;

et pour GSON

import com.google.gson.Gson;
73
répondu Prakash 2017-12-10 09:56:36

la réponse de @momo pour Apache HttpClient, version 4.3.1 ou ultérieure. J'utilise JSON-Java pour construire mon objet 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();
}
34
répondu Cigano Morrison Mendez 2014-08-19 14:55:59

il est probablement plus facile d'utiliser HttpURLConnection .

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

vous utiliserez JSONObject ou n'importe quoi pour construire votre JSON, mais pas pour gérer le réseau; vous devez le sérialiser et ensuite le passer à une connexion HttpURLConnection pour le poster.

20
répondu Alex Churchill 2015-06-17 20:42:31
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();
}
14
répondu Mohamed 2017-06-29 08:30:46

essayez ce code:

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();
}
12
répondu Sonu Dhakar 2014-09-13 09:46:51

j'ai trouvé cette question à la recherche de solution sur la façon d'envoyer la demande de poste de java client à Google Endpoints. Réponses ci-dessus, très probablement correct, mais ne fonctionne pas dans le cas de Google Endpoints.

Solution pour Google Endpoints.

  1. du corps de la Requête doit contenir uniquement chaîne JSON, pas paire nom=valeur.
  2. L'en-tête du type de contenu doit être réglé sur"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();
    }
    

    cela peut certainement être fait en utilisant HttpClient aussi.

6
répondu yurin 2015-06-13 15:39:02

je vous conseille http-request construit sur apache http api.

HttpRequest<String> httpRequest = HttpRequestBuilder.createPost(yourUri, String.class)
    .responseDeserializer(ResponseDeserializer.ignorableDeserializer()).build();

public void send(){
   ResponseHandler<String> 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 vous voulez envoyer JSON comme corps de requête vous pouvez:

  ResponseHandler<String> responseHandler = httpRequest.executeWithBody(yourJsonData);

proche de la gare et je vous conseille de lire la documentation avant de l'utiliser.

0
répondu Beno Arakelyan 2017-09-21 11:37:47