libcurl库的http get和http post使用

2023-05-16

一、libcurl中的http get使用方法

1. 为什么要使用libcurl

1) 作为http的客户端,可以直接用socket连接服务器,然后对到的数据进行http解析,但要分析协议头,实现代理…这样太麻烦了。

 

2) libcurl是一个开源的客户端url传输库,支持 FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,支持 Windows,Unix,Linux等平台,简单易用,且库文件占用空间不到200K

 

2. get和post方式

客户端在http连接时向服务提交数据的方式分为get和post两种


3.Get方式将所要传输的数据附在网址后面,然后一起送达服务器,它的优点是效率比较高;缺点是安全性差、数据不超过1024个字符、必须是7位的ASCII编码;查询时经常用此方法


4.Post通过Http post处理发送数据,它的优点是安全性较强、支持数据量大、支持字符多;缺点是效率相对低;编辑修改时多使用此方法


5.Get使用实例,其关键点就是设置回调函数


  

  

  

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "curl/curl.h"
#define HEAD_OUT "/root/project/test/head.out"
#define BODY_OUT "/root/project/test/body.out"
#define RET_EQUAL 0
#define RET_NOT_EQUAL 1
#define RET_NO_UPGRADE_FILE 2
#define RET_FIND_UPGRADE_FILE 3
#define RET_CHECK_OK 4
#define RET_ERROR 5
#define RET_SD_VERSION_ERROR 6
#define RET_OK 7
#define RET_CUR_VERSION_ERROR 8
#define RET_XOR_ERROR 9
#define RET_UPGRADE_OK 10
#define RET_UPGRADE_ERROR 11
#define RET_ERROR_FILE_NAME 12
#define RET_DELAY_CMD_NOT_RUN 13
#define RET_DEALY_CMD_ERROR 14
#define RET_GET_HASH_OK 15
#define RET_GET_HASH_ERROR 16
#define RET_AREADY_CP_VERSION 17
#define RET_NOT_CP_VERSION 18
#define RET_XOR_VERSION 19
#define RET_OPEN_VERSION_LIST_PATH_FAIL 20
#define OPEN_HEAD_FILE_ERROR 21
#define OPEN_BODY_FILE_ERROR 22
#define RET_GET_VERSION_PATH 23
#define RET_NOT_GET_VERSION_PATH 24
#define TIME_OUT 25
#define DOWNLOAD_OK 26
#define LOG fprintf
#define LOG_NOTICE stderr
size_t write_data(void * ptr, size_t size, size_t nmemb, void* stream)
{
int written = fwrite(ptr, size, nmemb, (FILE *)stream);
return written;
}
int detect_version(char * url)
{

CURL * curl_handle;

FILE * headerfile;

FILE * bodyfile;

static const char * headerfilename = HEAD_OUT;

static const char * bodyfilename = BODY_OUT;

// char buffer[STR_LEN] = {'\0'};

int res = 0;

printf("url=%s\n",url);

curl_global_init(CURL_GLOBAL_ALL);

curl_handle = curl_easy_init();

curl_easy_setopt(curl_handle, CURLOPT_URL, url);

curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);

curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);

headerfile = fopen(headerfilename, "wb");

if(headerfilename == NULL) {

curl_easy_cleanup(curl_handle);

return OPEN_HEAD_FILE_ERROR;

}

bodyfile = fopen(bodyfilename, "wb");

if(bodyfile == NULL) {

curl_easy_cleanup(curl_handle);

return OPEN_BODY_FILE_ERROR;

}

curl_easy_setopt(curl_handle, CURLOPT_WRITEHEADER, headerfile);

curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, bodyfile);

res = curl_easy_perform(curl_handle);

if(res != CURLE_OK)

LOG(LOG_NOTICE, "curl_easy_perform() faild:%s\n",

curl_easy_strerror(res));

fclose(headerfile);

fclose(bodyfile);

curl_easy_cleanup(curl_handle);

return res;

}
int main()
{
    detect_version("http://car.9797168.com:823/get_bus_info?mac=00:11:22:33:44:55");
    return 0;
}


6. POST使用实例,POST使用比较复杂但是比较常用

1.一般使用方法,可以解决大多数post数据的问题。

#include <stdio.h>   
#include <stdlib.h>   
#include <string.h>   
#include <curl/curl.h>   
  
#define POSTURL "http://www.xiami.com/member/login"   
#define POSTFIELDS "email=myemail@163.com&password=mypassword&autologin=1&submit=登 录&type="   
#define FILENAME "curlposttest.log"   
  
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);   
  
int main(int argc, char *argv[]) {   
    CURL *curl;   
    CURLcode res;   
    FILE *fptr;   
    struct curl_slist *http_header = NULL;   
  
    if ((fptr = fopen(FILENAME, "w")) == NULL) {   
        fprintf(stderr, "fopen file error: %s\n", FILENAME);   
        exit(1);   
    }   
  
    curl = curl_easy_init();   
    curl_easy_setopt(curl, CURLOPT_URL, POSTURL);   
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, POSTFIELDS);   //设置post属性,使用&来将表单属性连接在一起
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);   //回调函数,可有可无
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fptr);           //回调函数写入数据指针
    curl_easy_setopt(curl, CURLOPT_POST, 1);                 //设置libcurl发送的协议
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);              //设置版本
    curl_easy_setopt(curl, CURLOPT_HEADER, 1);               //设置http数据头
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);       //设置返回的数据量
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/Users/zhu/CProjects/curlposttest.cookie");   //设置cookie,不是必须
    res = curl_easy_perform(curl);   
    curl_easy_cleanup(curl);   
}   
  
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp) {   
    FILE *fptr = (FILE*)userp;   
    fwrite(buffer, size, nmemb, fptr);   
}  


2.post高级使用方法,特点简单,但不易于理解,其使用二进制传输的方式,适合于加密数据的传输。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "curl/curl.h"  
#include "http_rsa.h"

#define POSTURL "http://10.0.0.13:821/wifibox/"
 
#define HTTP_UPLOAD_FILD "/root/project/upload/upload.tar.gz"
#define HTTP_POST_TYPE_GPS "gps"
#define HTTP_POST_TYPE_SYS "sys"
#define HTTP_REPORT_TYPE "type"
#define HTTP_REPORT_SIGNATURE "signature"
#define HTTP_REPORT_INDEX "ident"
#define HTTP_REPORT_CONTENT "content"
int report_http_post(char* type, char* index, char* content, char* url)
{

 struct curl_httppost *post = NULL;

 struct curl_httppost *last = NULL;

 CURL *easy_handle = curl_easy_init();

 char asr_buff[1024]={0};

 int len =0;

 

 // 使用multi-parts form post

 curl_easy_setopt(easy_handle, CURLOPT_URL, url);

 openssl_rsa_enc(type, strlen(type), asr_buff, &len);

 // 文本数据

 curl_formadd(&post, &last, CURLFORM_COPYNAME, HTTP_REPORT_TYPE, CURLFORM_COPYCONTENTS, type, CURLFORM_END);

 curl_formadd(&post, &last, CURLFORM_COPYNAME, HTTP_REPORT_SIGNATURE, CURLFORM_COPYCONTENTS, asr_buff, CURLFORM_END);

 // 文本文件中的数据

 //curl_formadd(&post, &last, CURLFORM_COPYNAME, "signature", CURLFORM_FILECONTENT, "/root/project/sys", CURLFORM_END);

 curl_formadd(&post, &last, CURLFORM_COPYNAME, HTTP_REPORT_INDEX, CURLFORM_COPYCONTENTS, index, CURLFORM_END);

 if(1) //发送buff

 {

  curl_formadd(&post, &last, CURLFORM_COPYNAME, HTTP_REPORT_CONTENT, CURLFORM_COPYCONTENTS, content, CURLFORM_END);

 }

 else//发送文件

 {

  curl_formadd(&post, &last, CURLFORM_COPYNAME, HTTP_REPORT_CONTENT, CURLFORM_FILECONTENT, content, CURLFORM_END);

 }

 curl_easy_setopt(easy_handle, CURLOPT_HTTPPOST, post);

 curl_easy_perform(easy_handle);

 curl_formfree(post);

 curl_easy_cleanup(easy_handle);

 curl_global_cleanup();

 return 0;

}
#define MSC_INFO "11:22:33:44:55:66"
int main(int argc, char *argv[]) {

 report_http_post("buff", MSC_INFO, "{\"date\": \"2013-12-30 12:20:30\"}", POSTURL);

 report_http_post("file", MSC_INFO, HTTP_UPLOAD_FILD, POSTURL);

 return 0;

}


这个是curl提供的一个高级使用方法,在post/get数据过程中,使用二进制的方式来进行数据交互,解决加密数据传输是乱码的问题。

使用比较简单

1)新建两个发送数据的链表指针

 struct curl_httppost *post = NULL;
 struct curl_httppost *last = NULL;
2)使用curl_formadd函数将链表指针添加进发送队列中。

 curl_formadd(&post, &last, CURLFORM_COPYNAME, HTTP_REPORT_TYPE, CURLFORM_COPYCONTENTS, type, CURLFORM_END);

CURLFORM_COPYNAME:表单属性名称属性

HTTP_REPORT_TYPE:post表单属性名

CURLFORM_COPYCONTENTS:表单值属性,注意,根据所设置的值不一样,来决定表单属性值的格式,可以是buff,可以是文件,图片等。

type:post表单属性值


3)当然,使用curl_formadd方式和一般的curl方法是一样的,需要一般的初始化流程

CURL *easy_handle = curl_easy_init();等

注意,此处可以和一般的curl使用方式兼容,可以设置返回值得回调函数等。




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libcurl库的http get和http post使用 的相关文章

  • android httprequest java.net.UnknownHostException

    我想用android发出http请求 是使用这个 void testHTTP HttpClient httpClient new DefaultHttpClient HttpUriRequest request new HttpPost h
  • 是否可以检测 http git 远程是智能还是愚蠢?

    我正在我的应用程序中实现一个选项来使用 depth 1制作 git repo 的最小功能克隆 我刚刚意识到愚蠢的 http 传输不支持 depth 我想自动检测 http 远程是愚蠢的还是聪明的 这样我就可以省略 depth与哑 http
  • 在 PHP 中从 URL 斜杠后获取两个单词

    我需要从 URL 中获取两个单词 例如我有以下 URL http mydomain com alrajhi invoice 108678645541 http mydomain com alrajhi invoice 10867864554
  • 如何在java中以编程方式访问网页

    有一个网页 我想从中检索某个字符串 为此 我需要登录 单击一些按钮 填充文本框 单击另一个按钮 然后就会出现字符串 我怎样才能编写一个java程序来自动执行此操作 是否有任何有用的库用于此目的 Thanks Try HtmlUnit htt
  • 如何在 WordPress 中获取帖子中的类别标题?

    假设我在 WordPress 中有一篇名为 Hello World 的帖子 并且我直接查看此页面 我将如何找到 Hello World 类别并显示它 Use get the category http codex wordpress org
  • Windows 上 libcurl 的静态库[重复]

    这个问题在这里已经有答案了 如何将此库 libcurl 静态链接到 exe 我努力了 disable share enable static 没有帮助 我使用的是MingW32 有没有一种简单的方法来静态链接这个库 这样我的应用程序就不再有
  • 使用 Angularjs,$http 在 Microsoft Edge 中发布返回响应错误

    好吧 当我开发一个管理页面进行测试时 Microsoft Edge 中出现了一个奇怪的问题 这是从loginCtrl js服务器获取响应的部分源代码 http method POST url Define apiUrl admin logi
  • 是什么导致“线程被中止”异常随机发生并向浏览器显示 HTTP 标头和部分 HTML?

    发生的情况偶尔是随机的 而不是像您期望的那样将 HTML 返回到浏览器 它看起来有点像这样 线程正在中止 HTTP 1 1 200 OK 标题的其余部分 如 HTML 的 1 10 就是这样 他们实际上在浏览器窗口中收到了一堆文本 它不会一
  • ASP.NET - 将所有 https 请求重写为 http

    我的问题正是所提出的问题here https stackoverflow com questions 16276860 iis 7 adding ssl to one site all other sites responds to htt
  • 即使使用标头和 Session 对象,Python requests.get 也会失败并出现 403 禁止

    我正在发出 GET 请求来获取 JSON 它在任何设备上的任何浏览器中都可以正常工作 但不能通过 python 请求 url https angel co autocomplete new tags params query sci tag
  • Rest 和 Http 中“无状态”的含义

    当我阅读有关 REST 是什么的文档时 他们总是说 REST api 应该是无状态的 在这里 我感觉有点尴尬 因为普通的 HTTP 也是无状态的 既然REST可以说是一种使用HTTP协议的特殊架构 那么说REST应该是无状态的似乎是多余的
  • HTML/PHP 中的 POST 和 GET 有什么区别[重复]

    这个问题在这里已经有答案了 我正在编写一个 PHP 脚本 但我似乎无法真正让它工作 我正在测试基础知识 但我不太明白 GET 和 POST 意味着什么 有什么区别 我在网上看到的所有定义对我来说没有多大意义 到目前为止我编写的代码 但由于我
  • eBay API 调用不适用于 UPC/EAN

    eBay 的 API findItemsByProduct 操作适用于 UPC 和 EAN 但不幸的是它不起作用 例如 下面的 HTTP GET 请求会抛出 无效的产品 ID 值 错误41 Note 请将 SECURITY APPNAME
  • 为什么http使用CRLF作为行分隔符?

    据我所知 使用LF因为行分隔符非常流行 但我想知道为什么许多文本协议 如 HTTP FTP 使用CRLF作为它的行分隔符 我不认为这些协议是为旧打字机发明的 那么这有什么历史原因吗 我尝试通过谷歌 stackoverflow 和维基百科搜索
  • Crystal lang如何从http获取二进制文件

    In Ruby require open uri download open http example com download pdf IO copy stream download my file pdf 如何在水晶中做同样的事情 我们
  • Response.Redirect 并不总是重定向

    我们在一个工作不一致的页面上有一个简单的 Response Redirect IIS 6 0 大多数情况下 它会正确重定向 但我们收到一些用户抱怨 他们没有重定向 而是看到 302 对象移至此处 页面 该页面显示标题信息以及正确的位置 如果
  • LibCurl SFTP 重命名文件

    解决了 经过更多转换后 通过使用 重命名 作为引用命令 它需要包含原始名称的完整路径和包含重命名目标的完整路径 在我其他失败的尝试中 我没有尝试过这条路 大家好 我尝试了所有不同的组合 但一直失败 不知道我错过了什么 我正在尝试使用 Lib
  • 如何解析来自基于 C 的 Web 服务器的 HTTP 请求

    我有一个编程项目 我必须创建一个处理 HTTP 请求的多线程 Web 服务器 我刚刚学习了套接字编程 并且运行了一个客户端和一个服务器 我想知道解析 HTTP 请求标头的最佳方法是什么 我看到了这个 如何用C 解析http请求 https
  • 为什么我在 Firefox 中突然遇到“阻止加载混合活动内容”问题?

    今天早上 在将我的 Firefox 浏览器升级到最新版本 从 22 到 23 后 我的后台 网站 的一些关键功能停止工作 查看Firebug日志 报告了以下错误 Blocked loading mixed active content ht
  • 使用 urllib 编码时保持 url 参数有序

    我正在尝试用 python 模拟 get 请求 我有一个参数字典 并使用 urllib urlencode 对它们进行 urlencode 我注意到虽然字典的形式是 k1 v1 k2 v2 k3 v3 urlencoding 后参数的顺序切

随机推荐

  • 宏#define的三种基本定义方式:固定值,表达式,运算符。

    define xff1a define是C语言中的预处理命令 xff0c 预处理命令以 开头 xff0c 比如我们经常写的代码 include lt stdio h gt 也是预处理命令 define用于宏定义 xff0c 作用是方便程序段
  • 四旋翼飞行器的姿态解算小知识点

    1 惯性测量单元IMU InertialMeasurement Unit 姿态航向参考系统AHRS Attitude and Heading Reference System 地磁角速度重力MARG Magnetic Angular Rat
  • 四元数姿态解算中的地磁计融合解读

    笔者最近在做四轴 xff0c 涉及到地磁计的融合算法 xff0c 网上大多数是x IMU的融合代码 xff0c 但是这段代码对于地磁计的融合说明没有做过多的解释 xff0c 网上没有相关讨论 xff0c 仅在阿莫论坛看到一篇相关的代码解释
  • C++封装静态链接库及使用

    一 为什么要把程序封装成库 有时我们需要把自己的程序交给第三方调用 xff0c 但是又不想被别人看到自己的具体实现代码 xff0c 就封装成库给别人使用 库有动态链接库和静态链接库 xff0c 区别是动态链接库可以在程序运行时动态链接 xf
  • 四元数姿态的梯度下降法推导和解读

    笔者前面几篇文章讨论的是基于四元数的互补滤波算法 xff0c 并单独对地磁计融合部分做了详细的讨论和解释 而本文讨论的姿态融合算法叫做梯度下降法 xff0c 这部分代码可以参见Sebastian O H Madgwick在2010年4月发表
  • 四轴加速度计滤波

    加速度计滤波实验参数 xff1a 采样频率Fs 61 250Hz 截止频率Cutoff Frequency 未开电机静止 开电机悬停 未开电机转动飞控 原始输出 Raw 260 Hz 260Hz 260Hz MPU6050内部 LPF 94
  • Kalman论文笔记

    笔者前段时间阅读了一些关于Kalman的姿态论文 xff0c 本想把Kalman的知识点也整理出来发布 xff0c 无奈这编辑器不给力 xff0c 太多的公式无法复制粘贴 xff0c 图片格式上传的太复杂 xff0c 就放弃了 因此笔者只发
  • uCOS-III学习笔记

    前一段时间笔者学习uCOS III xff0c 第一次接触OS这个概念吧 下面把个人的学习笔记分享出来 xff0c 仅供参考 1 前后台系统 xff1a 后台程序是一个死循环 xff0c 也称为 任务级 xff0c 前台程序则是中断服务程序
  • 3.17 开发一个插件

    打开动态链接库 void dlopen const char filename int flag 返回一个操作句柄void Handle 61 dlopen libct so RTLD LAZY RTLD LAZY xff1a 解析动态库遇
  • 5.7 属性声明

    5 7 属性声明 主要用途 使用 attribute 来声明变量 函数的特殊属性 指导编译器来进行特定方面的优化或代码检查 使用方法 在声明后面添加 xff1a attribute ATTRIBUTE 例 xff1a int global
  • 8.18 模块设计原则:高内聚低耦合

    8 18 模块设计原则 xff1a 高内聚低耦合 模块内聚 定义 xff08 软考 xff09 块内联系 xff1a 模块内各元素的关联 交互程度 从功能角度 xff1a 自己的功能自己实现 xff0c 不麻烦其它模块 如何实现高内聚 功能
  • 9.12 中断(下):中断函数的编写

    9 12 中断 下 xff1a 中断函数的编写 中断特性 可随时打断正在执行的任务 可在任何地方打断正在执行的任务 中断返回后 xff0c CPU不一定重新执行被打断的任务 中断函数 调用时间不固定 xff1a 中断要自己保护现场 调用地点
  • 9.16 内存、外存与外设

    9 16 内存 外存与外设 按速度排列 寄存 缓存 内存 外存 存储分类 内存 又称主存 xff1a CPU能直接寻址的存储空间 存取速度快 包括 xff1a RAM ROM cache等 外存 又称辅存 xff1a 除CPU缓存和内存以外
  • 载波相位测量原理

    1 重建载波 定义 xff1a 载波调制了电文之后变成了非连续的波 xff0c 将非连续的载波信号恢复成连续的载波信号 码相关法 xff1a 方法 将所接收到的调制信号 xff08 卫星信号 xff09 与接收机产生的复制码相乘 技术要点
  • wpa_suplicant 详解 文章收集

    wpa suplicant 详解 文章收集 参考资料 https w1 fi wpa supplicant devel index html https zhuanlan zhihu com p 24246712 https www cnb
  • 玩转AOSP源码编译

    整理搬运一下大佬的文章 https www bilibili com video BV19f4y1r7E6 http liuwangshu cn batcoder aosp 3 compiling aosp html 1 前言 1 1 re
  • Qt 64位链接 mysql8.0 中出现的问题及其解决办法

    1 driver not loaded 原因总结 MinGW编译器中找不到 MySql驱动或者驱动位数不对MinGW编译器找不到 MySql动态库或者动态库有问题代码写的有问题 https blog csdn net l0p0c artic
  • Linux man 手册中各种括号的含义

    尖括号 lt gt 一般用于表示必选项或者参数的占位符 xff0c 实际使用时需要替换成具体的值 方括号 一般用于表示可选项或者参数的占位符 xff0c 实际使用时可以选择是否包含该选项或者参数 大括号 一般用于表示一组选项或者参数 xff
  • 批量创建 markdown 文件的脚本

    写一个 dos脚本 xff0c 其功能是创建 36 个 以 34 Linux内核编程 ch11 sec 34 为开头的 Markdown格式的文件 64 echo off chcp 65001 setlocal enabledelayede
  • libcurl库的http get和http post使用

    一 libcurl中的http get使用方法 1 为什么要使用libcurl 1 作为http的客户端 xff0c 可以直接用socket连接服务器 xff0c 然后对到的数据进行http解析 xff0c 但要分析协议头 xff0c 实现