20

With in my java code, I need to send a http post request to a specific URL with 3 headers:

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

This returns a response with a JSON "key":"value" pair in it that I then need to parse somehow to store the key/value (Alan/72) in a MAP. The response is (when using SOAPUI or Postman Rest):

    {
    "analyzedNames": [
        {
            "alternate": false               
        }
    ],
    "nameResults": [
        {
            "alternate": false,            
            "givenName": "John",           
            "nameCategory": "PERSONAL",
            "originalGivenName": "",
            "originalSurname": "",           
            "score": 72,
            "scriptType": "NOSCRIPT",            
        }
    ]
}

I can do this using SOAPUI or Postman Rest but how can I do this within Java as I'm getting an error:

****DEBUG main org.apache.http.impl.conn.DefaultClientConnection - Receiving response: HTTP/1.1 500 Internal Server Error****

My code is:

    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();
            }    
        }    
    }

Any help (with some sample code including which libraries to import) will be most appreciated.

THANKS

2 Answers 2

34

Yes, you can do it with java

You need apache HTTP client library http://hc.apache.org/ and 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);
Sign up to request clarification or add additional context in comments.

11 Comments

HI, I'm getting an error code of 403 which means that the request failed the authentication. Can I do for authentication? I believe that getCredentialsProvider() is depricated..so is there an alternate to this method in HttpClient API??
Usually you can use depricated method anyway. If you do not want you can try this hc.apache.org/httpcomponents-client-4.3.x/tutorial/html/… (I suppose you got last version http client)
following your suggestion, I'm getting an error and I've added to my original question above along with my code. Could you suggest anything?
There are a lot of java libraries for handling JSON. "jackson" is a good place to start.
You probably want to say: String json = EntityUtils.toString(entity, encoding);
|
0

I recommend http-request built on 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

}

I highly recommend reading the documentation before use.

Note: You can create your custom type instead of Map to parse response. See my answer here.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.