libcurl HTTPS POST数据发送?

时间:2011-10-21 14:17:02

标签: c libcurl

我有通过HTTP POST请求接收数据的应用程序。我正在尝试使用libcurl打开对此应用程序的请求,发送数据并从应用程序接收回复。这是我到目前为止的代码:

int main(void)
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if(curl) 
    {
        const int timeout = 30000;
        char outputmessage[]="VGhpcyBpcyBqdXN0IGEgbWVzc2FnZSwgaXQncyBub3QgdGhlIHJlYWwgdGhpbmc=";

        curl_easy_setopt(curl, CURLOPT_URL, "https://somehost.com/someapp");
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.5");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, outputmessage);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(outputmessage));
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout/1000);

        res = curl_easy_perform(curl);
        if(CURLE_OK != res)
        {
            printf("Error: %s\n", strerror(res));
            return 1;
        }

        // now what?

        // cleanup when done
        curl_easy_cleanup(curl);
    }
    return 0;
}

这基本上连接到服务器,我在curl_easy_perform()上得到了一个OK。我可以看到Wireshark上的连接。

两个问题:

1)这是通过POST发送数据的正确方法吗? 2)我如何从申请中得到答复。

我以为我需要使用curl_easy_recv(),但我看不清楚。欢迎任何示例代码。 感谢。

2 个答案:

答案 0 :(得分:5)

我认为您还应该考虑为响应标头添加处理程序:

cres = curl_easy_setopt( handle, CURLOPT_HEADERFUNCTION, HandleHeader );

如果这是一个专为应用程序使用而设计的Web服务,它的回复可能是一个只有标题的回复,没有响应数据。标题将包含以下数据:

HTTP/1.1 200 OK ...

你要找的主要内容是200代码,说请求没问题。

处理来自标头或响应的数据的函数应该采用void *,如果您将其用作字符串,则需要对其进行空终止。有关信息,这是我处理传入数据的方式(在这种情况下,我只在我的应用程序中使用返回代码 - 响应主体只是转到日志文件):

static size_t CurlHandleResponse(
  void *Ptr,
  size_t Size,
  size_t NoElements,
  void* Data )
{
  memcpy( &( gData[gDataLen] ), Ptr, (Size * NoElements) );
  gDataLen += (Size * NoElements);
  gData[ gDataLen ] = '\0';
  return (Size * NoElements);
}

...
ConvertUnprintable( gData, PrintStr );
...

为简洁起见,删除了错误处理!

答案 1 :(得分:1)

您无需调用任何接收功能。当控制传递给写完成的回调时,收到的响应会返回给您。设置这样的回调:

curl_res = curl_easy_setopt(handle,CURLOPT_WRITEFUNCTION,RecvResponseCallback);

在致电执行之前。

定义这样的回调:

size_t
RecvResponseCallback ( char *ptr, size_t size, size_t nmemb, char *data ) {
  // handle received data
  return size * nmemb;
}

响应数据由数据 arg指出( ptr arg,这是您想要查看的其他内容当你得到这个工作)。

退出RecvResponseCallback时,请务必返回(size_t) size * nmemb