Есть ли способ отправить 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 для отправки вышеуказанного запроса. Спасибо.
Ответ 1 · рейтинг 2 · kalyan
вы должны использовать 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)
Ответ 2 · рейтинг 1 · new_sys_admin
Следуя совету Кальяна, я получил вот такой код. Публикация этого для завершения.
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;
}
}