3

I try to make a request on server by HttpGet. But in message body should be a json object. Code below is not working because unit_id and sercret_key are not sent on server in body message. How can I do it?

JSONObject:

{
"unit_id": 12345,
"secret_key": "sdfadfsa6as987654754"
}

My code:

private HttpResponse makeRequest(int id, String secretKey) throws Exception {
    BasicHttpParams params = new BasicHttpParams();
    params.setParameter("id", id);

    params.setParameter("secret_key", secretKey);

    httpget.setHeader("Accept", "application/json");

    httpget.setParams(params);
    httpget.setHeader("Content-type", "application/json");

    // Handles what is returned from the page
    return httpclient.execute(httpget);
}

Edit: in php this request is made like this

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://0101.apiary.io/api/reservations/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\n    \"unit_id\": 12345,\n    \"secret_key\":     \"sdfadfsa6as987654754\"\n}");
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
faceman
  • 1,318
  • 11
  • 20
Amsik
  • 698
  • 2
  • 6
  • 26

3 Answers3

3

Basically, you cannot send row data in the body (JSON or anything) with an HTTP/GET request. The protocol simply does not allow you to do that. Obviously, you will have to use POST to do that in Android too. :)

UPDATE

I was incorrect. Infact the protocol does allow you to put an entity into the request object. This class can be used instead of Apache HttpGet.

public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase {

    public HttpGetWithEntity() {
        super();
    }

    public HttpGetWithEntity(URI uri) {
        super();
        setURI(uri);
    }

    public HttpGetWithEntity(String uri) {
        super();
        setURI(URI.create(uri));
    }

    @Override
    public String getMethod() {
        return HttpGet.METHOD_NAME;
    }
}

And use it like as follows,

HttpClient client = new DefaultHttpClient();
HttpGetWithEntity myGet = new HttpGetWithEntity("Url here");
myGet.setEntity(new StringEntity("This is the body", "UTF8"));
HttpResponse response = client.execute(myGet);

The source for HttpGetWithEntity is found here

C--
  • 16,393
  • 6
  • 53
  • 60
  • Setting a raw body is allowed, when sending put requests. Tested with the REST Console Extension for chrome: https://chrome.google.com/webstore/detail/rest-console/cokgbflfommojglbmbpenpphppikmonn?hl=en – Skip Oct 24 '13 at 11:27
  • I have clearly mentioned it is not possible with GET. I don't remember I have said anything about PUT at all. :) – C-- Oct 26 '13 at 04:25
  • yeah my fault. but for GET requests it is possible too. – Skip Oct 26 '13 at 19:14
  • @SubinSebastian any idea about my issue? its almost similar but with rx2androidnetworking : https://stackoverflow.com/questions/56244614/how-do-i-pass-a-bodyparameter-for-rx2androidnetworking-for-get-requests –  May 22 '19 at 01:33
2

If you wnat to add JSON object to your request it must be a Post request, and this is how you perform it:

public static String sendComment (String commentString, int taskId, String sessionId, int displayType, String url) throws Exception{

    //creating map object to creat Json object from it
    Map<String, Object> jsonValues = new HashMap<String, Object>();
    jsonValues.put("sessionID", sessionId);
    jsonValues.put("NewTaskComment", commentString);
    jsonValues.put("TaskID" , taskId);
    jsonValues.put("DisplayType" , displayType);
    JSONObject json = new JSONObject(jsonValues);

    //creating a post request.
    DefaultHttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost(url + SEND_COMMENT_ACTION);

    //setting json object to post request.
    AbstractHttpEntity entity = new ByteArrayEntity(json.toString().getBytes("UTF8"));
    entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
    post.setEntity(entity);

    //this is your response:
    HttpResponse response = client.execute(post);
    return getContent(response);    
}
Emil Adz
  • 40,709
  • 36
  • 140
  • 187
  • If i try to change it to httpost responce from server is 405 Method not allowed. – Amsik Mar 04 '13 at 13:48
  • @Emil Adz any idea about my issue? its almost similar but with rx2androidnetworking : https://stackoverflow.com/questions/56244614/how-do-i-pass-a-bodyparameter-for-rx2androidnetworking-for-get-requests –  May 22 '19 at 01:34
1

Here is nice example how to do it and it is working.

Apache HttpClient GET with body

But this approach is against RESTFUL api i think.

Community
  • 1
  • 1
Amsik
  • 698
  • 2
  • 6
  • 26