在C ++中使用cURL的JSON请求

时间:2014-04-14 05:57:20

标签: c++ json curl

我在cURL中有以下命令,这在终端中工作正常。

curl --insecure -X POST --data "username=testuser&password=12345" https://m360-prototype.herokuapp.com/sessions.json

这个json api会发送一些参数 - "status":{"code":200,"message":"OK"}

现在我希望我的c ++程序执行它。我已经设置并使用cURL进行ftp上传并从ftp示例下载。但我没有找到任何这样做的例子。

我想知道如何将用户名和密码参数传递给json api,并从中获取响应。

以下是我在网上找到的一些代码中尝试过的,它没有用。

struct curl_slist *headers=NULL; // init to NULL is important

headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "Content-Type: application/json");
headers = curl_slist_append(headers, "charsets: utf-8");

curl = curl_easy_init();
if(curl) {
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    curl_easy_setopt(curl, CURLOPT_URL, "https://m360-prototype.herokuapp.com/sessions.json");
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "username=testuser&password=12345");

    curl_easy_setopt(curl, CURLOPT_HTTPGET,1);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    res = curl_easy_perform(curl);

    if(CURLE_OK == res) {
        char *ct;
        /* ask for the content-type */
        res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
        if((CURLE_OK == res) && ct)
            printf("We received Content-Type: %s\n", ct);
    }
}

我如何从网上获得回复?我知道它将以字符串的形式出现,我有足够的能力解析它。

我正在查找传递给终端上执行的curl命令的所有params(--insecure,-X,POST, - data),以便对我必须做的事情一无所知。

我是一名图形程序员:)对Web服务不太好。 我很感激任何帮助。

3 个答案:

答案 0 :(得分:2)

要发送帖子数据,您需要告诉curl它在哪里。类似的东西:

std::string data = "username=testuser&password=12345";
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, data.length());
curl_easy_setopt(curl, CURLOPT_POST, 1);

要将响应读入内存,它会有点复杂 - 您需要调用一个回调函数来存储数据。有一个这个in the curl docs的例子,虽然您可以将结果附加到std :: string中,而不是像他们那样拥有自己的块结构。

答案 1 :(得分:1)

很大程度上取决于您发送请求的方式。

您发送数据的方式非常重要。如果你想要json格式的服务器响应,你也应该以json格式请求。

除了黑暗所说的内容,将它与JSON请求相结合,我得到了我期待的结果..

以下代码对我有用...你发送到服务器的params应该是json格式---

std::string data = "{\"username\":\"testuser\",\"password\":\"12345\"}";
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);  // for --insecure option
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, data.length());
curl_easy_setopt(curl, CURLOPT_POST, 1);

答案 2 :(得分:1)

Curl命令有一个选项-libcurl。它应该可以帮助您找出要使用的正确libcurl代码。

将此选项添加到工作Curl命令的末尾以及文件名,Curl将输出Curl命令的工作libcurl c示例。

  

curl --insecure -X POST --data" username = testuser& password = 12345" https://m360-prototype.herokuapp.com/sessions.json -libcurl test.cpp

使用-lcurl选项编译输出的代码。

  

g ++ -lcurl test.cpp -o testcurl

下面是我用来将JSON从c ++发送到node.js的libcurl代码示例。

// an existing array of MenuArrayObjects
var menuDataArray = [MenuArrayObject]()

// call function with array – which it will append an element to
getMainMenuItems(&menuDataArray)

Node.js(Express)接收JSON为:

  

{username:' bob',密码:' 12345' }