使用 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 将其发送到服务器?

http协议发送header+body+json及接收解析

使用 Http Post 发送图像

android 在服务器端生成json格式数据,在客户端怎么解析

使用 django 测试客户端发送 JSON

如何从我的休息服务发送一个 json 对象,以便我可以在客户端 javascript 上解析出来