libcurl HTTPS POST数据发送?

我有通过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()但我看不出怎么样。 欢迎任何示例代码。 谢谢。

我认为你还应该考虑为响应头添加一个处理程序:

 cres = curl_easy_setopt( handle, CURLOPT_HEADERFUNCTION, HandleHeader ); 

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

 HTTP/1.1 200 OK ... 

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

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

 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 ); ... 

为简洁起见,删除了error handling!

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

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