一、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使用实例,其关键点就是设置回调函数

  1. <pre code_snippet_id="172026" snippet_file_name="blog_20140126_1_7646331" name="code" class="html"></pre>
  2. <pre></pre>
  3. <pre></pre>
  4. <pre></pre>
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "curl/curl.h"
  5. #define HEAD_OUT "/root/project/test/head.out"
  6. #define BODY_OUT "/root/project/test/body.out"
  7. #define RET_EQUAL 0
  8. #define RET_NOT_EQUAL 1
  9. #define RET_NO_UPGRADE_FILE 2
  10. #define RET_FIND_UPGRADE_FILE 3
  11. #define RET_CHECK_OK 4
  12. #define RET_ERROR 5
  13. #define RET_SD_VERSION_ERROR 6
  14. #define RET_OK 7
  15. #define RET_CUR_VERSION_ERROR 8
  16. #define RET_XOR_ERROR 9
  17. #define RET_UPGRADE_OK 10
  18. #define RET_UPGRADE_ERROR 11
  19. #define RET_ERROR_FILE_NAME 12
  20. #define RET_DELAY_CMD_NOT_RUN 13
  21. #define RET_DEALY_CMD_ERROR 14
  22. #define RET_GET_HASH_OK 15
  23. #define RET_GET_HASH_ERROR 16
  24. #define RET_AREADY_CP_VERSION 17
  25. #define RET_NOT_CP_VERSION 18
  26. #define RET_XOR_VERSION 19
  27. #define RET_OPEN_VERSION_LIST_PATH_FAIL 20
  28. #define OPEN_HEAD_FILE_ERROR 21
  29. #define OPEN_BODY_FILE_ERROR 22
  30. #define RET_GET_VERSION_PATH 23
  31. #define RET_NOT_GET_VERSION_PATH 24
  32. #define TIME_OUT 25
  33. #define DOWNLOAD_OK 26
  34. #define LOG fprintf
  35. #define LOG_NOTICE stderr
  36. size_t write_data(void * ptr, size_t size, size_t nmemb, void* stream)
  37. {
  38. int written = fwrite(ptr, size, nmemb, (FILE *)stream);
  39. return written;
  40. }
  41. int detect_version(char * url)
  42. {
  43. CURL * curl_handle;
  44. FILE * headerfile;
  45. FILE * bodyfile;
  46. static const char * headerfilename = HEAD_OUT;
  47. static const char * bodyfilename = BODY_OUT;
  48. // char buffer[STR_LEN] = {'\0'};
  49. int res = 0;
  50. printf("url=%s\n",url);
  51. curl_global_init(CURL_GLOBAL_ALL);
  52. curl_handle = curl_easy_init();
  53. curl_easy_setopt(curl_handle, CURLOPT_URL, url);
  54. curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
  55. curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
  56. headerfile = fopen(headerfilename, "wb");
  57. if(headerfilename == NULL) {
  58. curl_easy_cleanup(curl_handle);
  59. return OPEN_HEAD_FILE_ERROR;
  60. }
  61. bodyfile = fopen(bodyfilename, "wb");
  62. if(bodyfile == NULL) {
  63. curl_easy_cleanup(curl_handle);
  64. return OPEN_BODY_FILE_ERROR;
  65. }
  66. curl_easy_setopt(curl_handle, CURLOPT_WRITEHEADER, headerfile);
  67. curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, bodyfile);
  68. res = curl_easy_perform(curl_handle);
  69. if(res != CURLE_OK)
  70. LOG(LOG_NOTICE, "curl_easy_perform() faild:%s\n",
  71. curl_easy_strerror(res));
  72. fclose(headerfile);
  73. fclose(bodyfile);
  74. curl_easy_cleanup(curl_handle);
  75. return res;
  76. }
  77. int main()
  78. {
  79. detect_version("http://car.9797168.com:823/get_bus_info?mac=00:11:22:33:44:55");
  80. return 0;
  81. }

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

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

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

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "curl/curl.h"
  5. #include "http_rsa.h"
  6. #define POSTURL "http://10.0.0.13:821/wifibox/"
  7. #define HTTP_UPLOAD_FILD "/root/project/upload/upload.tar.gz"
  8. #define HTTP_POST_TYPE_GPS "gps"
  9. #define HTTP_POST_TYPE_SYS "sys"
  10. #define HTTP_REPORT_TYPE "type"
  11. #define HTTP_REPORT_SIGNATURE "signature"
  12. #define HTTP_REPORT_INDEX "ident"
  13. #define HTTP_REPORT_CONTENT "content"
  14. int report_http_post(char* type, char* index, char* content, char* url)
  15. {
  16. struct curl_httppost *post = NULL;
  17. struct curl_httppost *last = NULL;
  18. CURL *easy_handle = curl_easy_init();
  19. char asr_buff[1024]={0};
  20. int len =0;
  21. // 使用multi-parts form post
  22. curl_easy_setopt(easy_handle, CURLOPT_URL, url);
  23. openssl_rsa_enc(type, strlen(type), asr_buff, &len);
  24. // 文本数据
  25. curl_formadd(&post, &last, CURLFORM_COPYNAME, HTTP_REPORT_TYPE, CURLFORM_COPYCONTENTS, type, CURLFORM_END);
  26. curl_formadd(&post, &last, CURLFORM_COPYNAME, HTTP_REPORT_SIGNATURE, CURLFORM_COPYCONTENTS, asr_buff, CURLFORM_END);
  27. // 文本文件中的数据
  28. //curl_formadd(&post, &last, CURLFORM_COPYNAME, "signature", CURLFORM_FILECONTENT, "/root/project/sys", CURLFORM_END);
  29. curl_formadd(&post, &last, CURLFORM_COPYNAME, HTTP_REPORT_INDEX, CURLFORM_COPYCONTENTS, index, CURLFORM_END);
  30. if(1) //发送buff
  31. {
  32. curl_formadd(&post, &last, CURLFORM_COPYNAME, HTTP_REPORT_CONTENT, CURLFORM_COPYCONTENTS, content, CURLFORM_END);
  33. }
  34. else//发送文件
  35. {
  36. curl_formadd(&post, &last, CURLFORM_COPYNAME, HTTP_REPORT_CONTENT, CURLFORM_FILECONTENT, content, CURLFORM_END);
  37. }
  38. curl_easy_setopt(easy_handle, CURLOPT_HTTPPOST, post);
  39. curl_easy_perform(easy_handle);
  40. curl_formfree(post);
  41. curl_easy_cleanup(easy_handle);
  42. curl_global_cleanup();
  43. return 0;
  44. }
  45. #define MSC_INFO "11:22:33:44:55:66"
  46. int main(int argc, char *argv[]) {
  47. report_http_post("buff", MSC_INFO, "{\"date\": \"2013-12-30 12:20:30\"}", POSTURL);
  48. report_http_post("file", MSC_INFO, HTTP_UPLOAD_FILD, POSTURL);
  49. return 0;
  50. }

这个是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使用方式兼容,可以设置返回值得回调函数等。

libcurl库的http get和http post使用【转】的更多相关文章

  1. C++ 用libcurl库进行http通讯网络编程

    使用libcurl完成http通讯,很方便而且是线程安全,转载一篇比较好的入门文章 转载自 http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724 ...

  2. C++ 用libcurl库进行http通讯网络编程(转)

    转载:http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三. ...

  3. Cocos2d-x移植到WindowsPhone8移植问题-libcurl库移植问题

    在Cocos2d-x 3.x最新版本中提供了Windows Phone 8平台移植libcurl库所需要的头文件和库文件.但要在Windows Phone 8平台成功移植libcurl库还是很不容易, ...

  4. Cocos开发中Visual Studio下libcurl库开发环境设置

    我们介绍一下win32中Visual Studio下libcurl库开发环境设置.Cocos2d-x引擎其实已经带有为Win32下访问libcurl库,Cocos2d-x 3.x中libcurl库文件 ...

  5. C++ 用libcurl库进行http通讯网络编程[转]

    http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.cur ...

  6. C/C++ 用libcurl库进行http通讯网络编程

    C/C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_p ...

  7. C语言 HTTP上传文件-利用libcurl库上传文件

    原文  http://justwinit.cn/post/7626/ 通常情况下,一般很少使用C语言来直接上传文件,但是遇到使用C语言编程实现文件上传时,该怎么做呢? 借助开源的libcurl库,我们 ...

  8. C++ 用libcurl库进行http 网络通讯编程

      一.LibCurl基本编程框架libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcur ...

  9. HTTP多线程下载+断点续传(libcurl库)

    目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_perform 函数说明(error 状态码) 五.lib ...

  10. 最全的libcurl库资源整理

    C++ 用libcurl库进行http 网络通讯编程 百度登陆协议分析!!!用libcurl来模拟百度登陆 C++使用libcurl做HttpClient 使用libcurl库进行HTTP的下载 li ...

随机推荐

  1. jqplot利用ajax传值画图表(利用jsp连接数据库)

    实现从数据库中取得数据,再把数据传给画jqplot的jsp界面!jsp界面再进行画图,画出我们所需的图表! 有两个jsp界面,7-12.jsp用来连接数据库,并把数据传给ajaxauto.jsp,aj ...

  2. 当Java遇到XML 的邂逅+dom4j

    XML简介: XML:可扩展标记语言! 01.很象html 02.着重点是数据的保存 03.无需预编译 04.符合W3C标准 可扩展:我们可以自定义,完全按照自己的规则来! 标记: 计算机所能认识的信 ...

  3. linux Shell 脚本编写

    1. http://www.jb51.net/article/28514.htm 2. http://www.runoob.com/linux/linux-shell.html

  4. linux 输入设备驱动

    <输入子系统简介> a:背景 内核的输入子系统是对“分散的”,“多种不同类别”的输入设备(键盘,鼠标,跟踪杆,触摸屏,加速度计等)进行“统一处理”的驱动程序.具有如下特点: a-1:统一各 ...

  5. 懒人的福利?教你用set维护斜率优化凸包

    斜率优化题目大家肯定都做得不少了,有一些题目查询插入点的x坐标和查询斜率都不单调,这样就需要维护动态凸包并二分斜率.(例如bzoj1492) 常规的做法是cdq分治或手写平衡树维护凸包,然而如果我不愿 ...

  6. j.u.c系列(08)---之并发工具类:CountDownLatch

    写在前面 CountDownLatch所描述的是”在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待“:用给定的计数 初始化 CountDownLatch.由于调用了 countDo ...

  7. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped

    节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作 ...

  8. Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors

    Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ...

  9. centos中安装tomcat+jenkins

    1) 安装tomcat 安装tomcat6: http://www.cnblogs.com/itech/p/3506011.html 安装tomcat7: http://www.cnblogs.com ...

  10. delphi Image 处理

    procedure ResizeBmp(Src,Dst:String);var SrcBM,DstBM:TBitMap; Rect:TRect; NewW,NewH,PicW,PicH:Integer ...