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 continue à revenir avec un 500. Le fournisseur de service dit que je dois envoyer JSON. Comment cela se fait-il avec Apache HttpClient 3.1+?
Apache HttpClient ne sait rien du JSON, vous devrez donc construire votre JSON séparément. Pour ce faire, je vous recommande de consulter la simple bibliothèque JSON-Java de json.org . (Si "JSON-Java" ne vous convient pas, json.org contient 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 POST it
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);
Modifier
Remarque - La réponse ci-dessus, comme demandé dans la question, s'applique à Apache HttpClient 3.1. Cependant, pour aider ceux qui recherchent 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);
Pour 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);
Remarque:
1 pour compiler le code, les packages httpclient
et httpcore
doivent être importés.
2 bloc try-catch a été omis.
Référence : guide officiel appache
le projet Commons HttpClient est maintenant en fin de vie et n'est plus en cours de développement. Il a été remplacé par le projet Apache HttpComponents dans ses modules HttpClient et HttpCore.
Comme mentionné dans l'excellente réponse de janoside, vous devez construire la chaîne JSON et la définir en tant que 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 de Jackson 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));