使用 HTTP 客户端为 JSON 列表发送和解析响应
Posted
技术标签:
【中文标题】使用 HTTP 客户端为 JSON 列表发送和解析响应【英文标题】:Sending and Parsing Response using HTTP Client for a JSON List 【发布时间】:2013-12-04 11:29:30 【问题描述】:在我的 java 代码中,我需要向具有 3 个标头的特定 URL 发送一个 http post 请求:
URL: http://localhost/something
Referer: http://localhost/something
Authorization: Basic (with a username and password)
Content-type: application/json
这会返回一个响应,其中包含一个 JSON "key":"value" 对,然后我需要以某种方式对其进行解析以将键/值 (Alan/72) 存储在 MAP 中。响应是(使用 SOAPUI 或 Postman Rest 时):
"analyzedNames": [
"alternate": false
],
"nameResults": [
"alternate": false,
"givenName": "John",
"nameCategory": "PERSONAL",
"originalGivenName": "",
"originalSurname": "",
"score": 72,
"scriptType": "NOSCRIPT",
]
我可以使用 SOAPUI 或 Postman Rest 来执行此操作,但由于出现错误,我该如何在 Java 中执行此操作:
****DEBUG main org.apache.http.impl.conn.DefaultClientConnection - Receiving response: HTTP/1.1 500 Internal Server Error****
我的代码是:
public class NameSearch
/**
* @param args
* @throws IOException
* @throws ClientProtocolException
*/
public static void main(String[] args) throws ClientProtocolException, IOException
// TODO Auto-generated method stub
DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
StringWriter writer = new StringWriter();
//Define a postRequest request
HttpPost postRequest = new HttpPost("http://127.0.0.1:1400/dispatcher/api/rest/search");
//Set the content-type header
postRequest.addHeader("content-type", "application/json");
postRequest.addHeader("Authorization", "Basic ZW5zYWRtaW46ZW5zYWRtaW4=");
try
//Set the request post body
StringEntity userEntity = new StringEntity(writer.getBuffer().toString());
postRequest.setEntity(userEntity);
//Send the request; return the response in HttpResponse object if any
HttpResponse response = defaultHttpClient.execute(postRequest);
//verify if any error code first
int statusCode = response.getStatusLine().getStatusCode();
finally
//Important: Close the connect
defaultHttpClient.getConnectionManager().shutdown();
任何帮助(包括一些示例代码,包括要导入的库)将不胜感激。
谢谢
【问题讨论】:
【参考方案1】:是的,你可以用java来做
你需要apache HTTP客户端库http://hc.apache.org/和commons-io
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://localhost/something");
post.setHeader("Referer", "http://localhost/something");
post.setHeader("Authorization", "Basic (with a username and password)");
post.setHeader("Content-type", "application/json");
// if you need any parameters
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
urlParameters.add(new BasicNameValuePair("paramName", "paramValue"));
post.setEntity(new UrlEncodedFormEntity(urlParameters));
HttpResponse response = client.execute(post);
HttpEntity entity = response.getEntity();
Header encodingHeader = entity.getContentEncoding();
// you need to know the encoding to parse correctly
Charset encoding = encodingHeader == null ? StandardCharsets.UTF_8 :
Charsets.toCharset(encodingHeader.getValue());
// use org.apache.http.util.EntityUtils to read json as string
String json = EntityUtils.toString(entity, StandardCharsets.UTF_8);
JSONObject o = new JSONObject(json);
【讨论】:
您好,我收到错误代码 403,这意味着请求未通过身份验证。我可以做身份验证吗?我相信 getCredentialsProvider() 已被贬低..那么在 HttpClient API 中是否有此方法的替代方法?? 通常你可以使用 deprecated 方法。如果你不想要你可以试试这个hc.apache.org/httpcomponents-client-4.3.x/tutorial/html/…(我想你有最新版本的http客户端) 根据您的建议,我遇到了一个错误,我已将我的代码连同我的代码一起添加到上面的原始问题中。你有什么建议吗? 有很多处理 JSON 的 java 库。 “杰克逊”是一个很好的起点。 你可能想说:String json = EntityUtils.toString(entity, encoding);【参考方案2】:我推荐http-request 基于 Apache HTTP API。
HttpRequest<String> httpRequest = HttpRequestBuilder.createPost(yourUri
new TypeReference<Map<String, List<Map<String, Object>>>>)
.basicAuth(userName, password)
.addContentType(ContentType.APPLICATION_JSON)
.build();
public void send()
ResponseHandler<String> responseHandler = httpRequest.executeWithBody(yourJsonData);
int statusCode = responseHandler.getStatusCode();
Map<String, List<Map<String, Object>>> response = responseHandler.get(); // Before calling the get () method, make sure the response is present: responseHandler.hasContent()
System.out.println(response.get("nameResults").get(0).get("givenName")); //John
我强烈建议在使用前阅读文档。
注意:您可以创建自定义类型而不是 Map 来解析响应。看我的回答here。
【讨论】:
以上是关于使用 HTTP 客户端为 JSON 列表发送和解析响应的主要内容,如果未能解决你的问题,请参考以下文章
如何将复杂(嵌套)对象解析为 JSON 并在 Flutter 中使用 HTTP 将其发送到服务器?