2012-11-05 68 views
1

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

我的当前请求使用的libcurl是

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

。它相当于卷曲是

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代码。谢谢。

回答

2

你应该使用CURLOPT_POSTFIELDS

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

-d选项用于POST方法。来自卷边手册页

-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) 
+0

我认为CURLOPT_POST和CURLOPT_POSTFIELDS与http post请求有关。我需要一些HTTP GET请求。 –

+0

海事组织,不是一个好主意。但仍然可以实现。答案已更新。 – kalyan

+0

谢谢。我接受了使用POST方法的建议,并使其运行。我遵循这个代码框架。 http://curl.haxx.se/libcurl/c/simplepost.html –

0

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