libcurl http получить запрос в формате json

Есть ли способ отправить HTTP-запрос на получение с помощью libcurl в формате JSON?

Мой текущий запрос

curl_easy_setopt(curl_handle, CURLOPT_URL, "http://localhost:9200/_search?q=tag:warcraft")

с помощью libcurl. Это эквивалентно в curl

curl -XGET http://localhost:9200/_all/tweet/_search?q=tag:warcraft

Я хотел бы отправить следующий запрос на завивание (в формате json), используя libcurl.

curl -XGET http://localhost:9200/_search -d '{
    "query" : {
        "term" : { "tag": "warcraft" }
    }
}'

Я хотел бы знать эквивалентный код libcurl для отправки вышеуказанного запроса. Спасибо.


person new_sys_admin    schedule 05.11.2012    source источник


Ответы (2)


вы должны использовать CURLOPT_POSTFIELDS

curl_easy_setopt(curl, CURLOPT_POST, 1); 
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data_encoded_as_string);

Параметр -d используется для метода POST. На странице руководства curl

-d, --data Отправляет указанные данные в POST-запросе на HTTP-сервер.

Если вам нужно отправить больше данных, которые не могут поместиться в строку запроса, вы должны использовать метод POST.

http://en.wikipedia.org/wiki/POST_%28HTTP%29

В рамках запроса GET некоторые данные могут передаваться в строке запроса URI, указывая, например, условия поиска, диапазоны дат или другую информацию, определяющую запрос. В рамках запроса POST произвольное количество данных любого типа может быть отправлено на сервер в теле сообщения запроса.

Если вам строго нужно использовать GET (?), Сформируйте свой URL-адрес таким образом, чтобы поместить ваши данные json в саму строку запроса.

query_string = "q=" + json_encoded_to_str
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://localhost:9200/_search?" + query_string)
person kalyan    schedule 05.11.2012
comment
Я думал, что CURLOPT_POST и CURLOPT_POSTFIELDS имеют отношение к почтовому запросу http. Мне нужно что-то для запроса HTTP GET. - person new_sys_admin; 05.11.2012
comment
ИМО, не лучшая идея. Но все же достижимо. Ответ обновлен. - person kalyan; 06.11.2012
comment
Спасибо. Я воспользовался вашим советом по использованию метода POST и заставил его работать. Я следовал этому скелету кода. curl.haxx.se/libcurl/c/simplepost.html - person new_sys_admin; 06.11.2012
comment
@dineshsriram хорошо! Удачного кодирования. - person kalyan; 06.11.2012

Следуя совету Кальяна, я получил вот такой код. Публикация этого для завершения.

int main() {

     CURL *curl_handle;     
     CURLcode res;

    static const char *postthis="{\"query\":{\"term\":{\tag\":\"warcraft\"}}}";
    curl_global_init(CURL_GLOBAL_ALL);
    curl_handle = curl_easy_init();

    if(curl_handle) {

        curl_easy_setopt(curl_handle, CURLOPT_URL, "http://localhost:9200/_search");
        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, postthis);

        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, (long)strlen(postthis));
        curl_easy_setopt(curl_handle, CURLOPT_WRITEHEADER, stdout);
        curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, stdout);

        res = curl_easy_perform(curl_handle);
        if(res != CURLE_OK)
                  fprintf(stderr, "curl_easy_perform() failed: %s\n",
                                        curl_easy_strerror(res));
        curl_easy_cleanup(curl_handle);
        return 0;
    }
}
person new_sys_admin    schedule 06.11.2012