1

有没有办法使用 JSON 格式的 libcurl 发送 HTTP 获取请求?

我目前的要求是

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

我想使用 libcurl 发送以下 curl 请求(以 json 格式)。

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

我想知道发送上述请求的等效 libcurl 代码。谢谢。

4

2 回答 2

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_(HTTP)

作为 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)
于 2012-11-05T18:50:37.137 回答
1

按照 kalyan 的建议,这是我最终得到的代码。发布此以完成。

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;
    }
}
于 2012-11-06T14:13:59.273 回答