这里一个java程序员进行C++开发使用libcurl踩过的坑:java
1. 发送指定请求类型body,比较通用方法以下,能够直接填写数据并手动指定content type,若是是form表单等形式,则须要参考curl_formadd方法程序员
struct curl_slist *list = NULL; list = curl_slist_append(list, "Content-Type: application/octet-stream"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); /* size of the POST data */ curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, bufferLen); /* pass in a pointer to the data - libcurl will not copy curl_easy_setopt(curl, CURLOPT_POSTFIELDS, buffer);
2. 响应结果包含了响应行和头域信息app
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);curl
如上所示,获得的response包含响应行和头域信息,并且网上也没有相关问题描述。缘由为设置了以下参数。url
//CURLOPT_HEADER设置为1时,回调数据会返回响应行和header行 curl_easy_setopt(curl, CURLOPT_HEADER, 1);
3.form-data包拆分问题,多了一个Continuation的包,虽然跟踪流显示是同样的,可是服务端解析失败spa
这个最终发现坑在我添加了一个自定义头域,头域的值以\n结尾,libcurl不会对其进行转义,致使请求行之间多了一个空行,http请求格式不彻底符合协议标准致使code
4. curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode); 崩溃问题orm
其实是由于 httpCode 类型错误,应该申明为long,若是申明为int,则调用时可能出现段错误。blog
参考 https://www.bo56.com/libcurl%E4%B8%AD%E4%BD%BF%E7%94%A8curl_easy_getinfo-%E4%BA%A7%E7%94%9F%E6%AE%B5%E9%94%99%E8%AF%AF%E5%88%86%E6%9E%90/ssl
5.不支持https问题
访问https报错“Protocol https not supported or disabled in libcurl”,可经过curl -V 查看是否有HTTPS。若是没有则不支持,须要更新。
可行办法之一是下载源码。编译安装时 执行
./configure -with-ssl
带上-with-ssl 进行编译