zoukankan      html  css  js  c++  java
  • C语言LIBCURL库使用注意事项

    这里一个java程序员进行C++开发使用libcurl踩过的坑:

    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. 响应结果包含了响应行和头域信息

    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);

    如上所示,得到的response包含响应行和头域信息,而且网上也没有相关问题描述。原因为设置了如下参数。

            //CURLOPT_HEADER设置为1时,回调数据会返回响应行和header行
            curl_easy_setopt(curl, CURLOPT_HEADER, 1);

    3.form-data包拆分问题,多了一个Continuation的包,虽然跟踪流显示是一样的,但是服务端解析失败

    这个最终发现坑在我添加了一个自定义头域,头域的值以 结尾,libcurl不会对其进行转义,导致请求行之间多了一个空行,http请求格式不完全符合协议标准导致

    4. curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode); 崩溃问题

    实际上是因为 httpCode 类型错误,应该申明为long,如果申明为int,则调用时可能出现段错误。

    参考 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/

    5.不支持https问题

    访问https报错“Protocol https not supported or disabled in libcurl”,可通过curl -V 查看是否有HTTPS。如果没有则不支持,需要更新。

    可行办法之一是下载源码。编译安装时 执行

    ./configure -with-ssl

    带上-with-ssl 进行编译

  • 相关阅读:
    C语言-10-位域与共用体
    python-并发编程
    计算机操作系统
    网络编程-Socket
    网络编程-基础
    python-面向对象进阶
    python-面向对象
    python-模块分类与导入
    python-函数进阶
    python-函数内置方法
  • 原文地址:https://www.cnblogs.com/lmsthoughts/p/9229608.html
Copyright © 2011-2022 走看看