Как опубликовать запрос JSON с помощью Apache HttpClient?
У меня что-то вроде следующего:
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();
он продолжает возвращаться с 500. Поставщик услуг говорит, что мне нужно отправить JSON. Как это делается с Apache HttpClient 3.1+?
2 ответов
Apache HttpClient ничего не знает о JSON, поэтому вам нужно будет создать свой JSON отдельно. Для этого я рекомендую проверить simple в JSON в Java библиотека из json.org. (Если "JSON-java" вам не подходит, json.org имеет большой список библиотек, доступных на разных языках.)
после того, как вы создали свой JSON, вы можете использовать что-то вроде кода ниже для публикации это
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);
редактировать
Примечание-приведенный выше ответ, как указано в вопросе, относится к Apache HttpClient 3.1. Однако, чтобы помочь любому, кто ищет реализацию против последнего клиента 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);
Как упоминалось в отличном ответе janoside, вам нужно построить строку JSON и установить ее как StringEntity
.
чтобы построить строку JSON, вы можете использовать любую библиотеку или метод, который вам удобен. Библиотека Джексона - один из простых примеров:
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));