HttpGet с телом запроса android

Я пытаюсь сделать запрос на сервер с помощью HttpGet. Но в теле сообщения должен быть объект json. Код ниже не работает, потому что unit_id и secret_key не отправляются на сервер в теле сообщения. Как мне это сделать?

JSONОбъект:

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

Мой код:

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

Редактировать: в php этот запрос делается так

<?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);

person Amsik    schedule 04.03.2013    source источник
comment
Похоже, вы не указали URL для своего запроса.   -  person zz3599    schedule 04.03.2013
comment
Я пробую этот код снова на сервере, и ответ равен 400, что я не установил тело сообщения.   -  person Amsik    schedule 04.03.2013
comment
по определению, GET => нет тела запроса   -  person njzk2    schedule 04.03.2013
comment
Это должно быть сделано как-то. Код выше из php работает хорошо, поэтому я надеюсь, что это нужно сделать и в java для Android.   -  person Amsik    schedule 04.03.2013


Ответы (3)


По сути, вы не можете отправлять данные строки в теле (JSON или что-то еще) с запросом HTTP/GET. Протокол просто не позволяет вам это сделать. Очевидно, вам придется использовать POST для этого и в Android. :)

ОБНОВЛЕНИЕ

Я был неправ. На самом деле протокол позволяет вам поместить объект в объект запроса. Этот класс можно использовать вместо 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;
    }
}

И используйте его следующим образом:

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

Источник для HttpGetWithEntity найден здесь

person Subin Sebastian    schedule 17.09.2013
comment
Допускается установка необработанного тела при отправке пут-запросов. Протестировано с расширением консоли REST для Chrome: chrome.google.com /веб-магазин/деталь/остальная консоль/ - person Skip; 24.10.2013
comment
Я ясно упомянул, что это невозможно с GET. Не помню, чтобы я вообще что-то говорил о PUT. :) - person Subin Sebastian; 26.10.2013
comment
да моя вина. но для GET запросов тоже можно. - person Skip; 26.10.2013
comment
@SubinSebastian есть идеи по поводу моей проблемы? это почти похоже, но с сетью rx2android: stackoverflow.com/questions/56244614/ - person ; 22.05.2019

Если вы хотите добавить объект JSON в свой запрос, это должен быть запрос Post, и вот как вы это делаете:

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);    
}
person Emil Adz    schedule 04.03.2013
comment
Если я попытаюсь изменить его на httppost, ответ сервера будет 405. Метод не разрешен. - person Amsik; 04.03.2013
comment
@Emil Adz есть идеи по поводу моей проблемы? это почти похоже, но с сетью rx2android: stackoverflow.com/questions/56244614/ - person ; 22.05.2019

Вот хороший пример, как это сделать, и он работает.

Apache HttpClient GET с телом

Но я думаю, что этот подход против RESTFUL API.

person Amsik    schedule 04.03.2013