【问题标题】:libcurl http get request in json formatlibcurl http 获取json格式的请求
【发布时间】:2012-11-05 16:42:17
【问题描述】:

有没有办法使用 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 代码。谢谢。

【问题讨论】:

    标签: c http curl get libcurl


    【解决方案1】:

    你应该使用 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)
    

    【讨论】:

    • 我认为 CURLOPT_POST 和 CURLOPT_POSTFIELDS 与 http post 请求相关。我需要一些用于 HTTP GET 请求的东西。
    • 国际海事组织,不是一个好主意。但还是可以实现的。答案已更新。
    • 谢谢。我接受了你关于使用 POST 方法的建议并让它发挥作用。我遵循了这个代码框架。 curl.haxx.se/libcurl/c/simplepost.html
    • @dineshsriram 不错!编码愉快。
    【解决方案2】:

    按照 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-03
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 2016-03-10
      • 2017-02-20
      • 2015-02-22
      • 2014-02-26
      • 1970-01-01
      相关资源
      最近更新 更多