web-dev-qa-db-ja.com

JSONリストのHTTPクライアントを使用した応答の送信と解析

私のJavaコードでは、3つのヘッダーを持つ特定のURLにhttp投稿リクエストを送信する必要があります。

URL: http://localhost/something
Referer: http://localhost/something 
Authorization: Basic (with a username and password)
Content-type: application/json

これにより、JSONの「キー」:「値」のペアを含む応答が返されます。この応答を何らかの方法で解析して、キー/値(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();
            }    
        }    
    }

ヘルプ(インポートするライブラリを含むいくつかのサンプルコードを含む)を歓迎します。

ありがとう

18
Global Dictator

はい、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);
26
Georgy Gobozov

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の代わりにカスタムタイプを作成して、応答を解析できます。私の答えをご覧ください こちら

0
Beno Arakelyan