104 votes

Comment envoyer une requête POST JSON en utilisant Apache HttpClient ?

J'ai quelque chose comme ce qui suit :

final String url = "http://example.com";

final HttpClient httpClient = new HttpClient();
final PostMethod postMethod = new PostMethod(url);
postMethod.addRequestHeader("Content-Type", "application/json");
postMethod.addParameters(new NameValuePair[]{
        new NameValuePair("name", "value)
});
httpClient.executeMethod(httpMethod);
postMethod.getResponseBodyAsStream();
postMethod.releaseConnection();

Il revient toujours avec un 500. Le fournisseur de services me dit que je dois envoyer JSON. Comment cela se fait-il avec Apache HttpClient 3.1+ ?

203voto

janoside Points 673

Apache HttpClient ne connaît rien au JSON, vous devrez donc construire votre JSON séparément. Pour ce faire, je vous recommande d'utiliser le module simple JSON-java bibliothèque de json.org . (Si "JSON-java" ne vous convient pas, json.org propose une grande liste de bibliothèques disponibles dans différentes langues).

Une fois que vous avez généré votre JSON, vous pouvez utiliser quelque chose comme le code ci-dessous pour le POST.

StringRequestEntity requestEntity = new StringRequestEntity(
    JSON_STRING,
    "application/json",
    "UTF-8");

PostMethod postMethod = new PostMethod("http://example.com/action");
postMethod.setRequestEntity(requestEntity);

int statusCode = httpClient.executeMethod(postMethod);

Editar

Remarque - La réponse ci-dessus, telle que demandée dans la question, s'applique à Apache HttpClient 3.1. Cependant, pour aider toute personne cherchant une implémentation avec le dernier client Apache :

StringEntity requestEntity = new StringEntity(
    JSON_STRING,
    ContentType.APPLICATION_JSON);

HttpPost postMethod = new HttpPost("http://example.com/action");
postMethod.setEntity(requestEntity);

HttpResponse rawResponse = httpclient.execute(postMethod);

29voto

ZhaoGang Points 510

Para Apache HttpClient 4.5 ou une version plus récente :

    CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpPost httpPost = new HttpPost("http://targethost/login");
    String JSON_STRING="";
    HttpEntity stringEntity = new StringEntity(JSON_STRING,ContentType.APPLICATION_JSON);
    httpPost.setEntity(stringEntity);
    CloseableHttpResponse response2 = httpclient.execute(httpPost);

Note :

1 afin de faire compiler le code, les deux httpclient et httpcore doit être importé.

2 Le bloc try-catch a été omis.

Référence : guide officiel d'appache

le projet Commons HttpClient est maintenant en fin de vie, et n'est plus développé. Il a été remplacé par le projet Apache HttpComponents dans ses modules HttpClient et HttpCore.

10voto

ADTC Points 1786

Comme mentionné dans l'excellente réponse de janoside vous devez construire la chaîne JSON et la définir en tant qu'objet StringEntity .

Pour construire la chaîne JSON, vous pouvez utiliser n'importe quelle bibliothèque ou méthode avec laquelle vous êtes à l'aise. La bibliothèque Jackson en est un exemple simple :

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;

ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
node.put("name", "value"); // repeat as needed
String JSON_STRING = node.toString();
postMethod.setEntity(new StringEntity(JSON_STRING, ContentType.APPLICATION_JSON));

2voto

Supun Sandaruwan Points 151

J'utilise la bibliothèque JACKSON pour convertir l'objet en JSON et définir le corps de la requête comme ci-dessous. Voici l'exemple complet.

try (CloseableHttpClient httpclient = HttpClients.createDefault()) {

    HttpPost httpPost = new HttpPost("https://jsonplaceholder.typicode.com/posts");

    Post post = new Post("foo", "bar", 1);
    ObjectWriter ow = new ObjectMapper().writer();
    String strJson = ow.writeValueAsString(post);
    System.out.println(strJson);

    StringEntity strEntity = new StringEntity(strJson, ContentType.APPLICATION_JSON);
    httpPost.setEntity(strEntity);
    httpPost.setHeader("Content-type", "application/json");

    try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
        System.out.println(response.getCode() + " " + response.getReasonPhrase());

        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);
        System.out.println(result);

        EntityUtils.consume(entity);
    } catch (ParseException e) {
        e.printStackTrace();
    }

} catch (IOException e) {
    System.out.println(e.getMessage());
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X