欢迎关注技术公众号:汉客儿
0x00. 前面
以前用Wininet api包了一个简单易用的http请求的lib,但是居然会遇到系统不支持的情况,难道要我自己用socket写吗?no way!
以前知道liburl,第一次使用,啥都不知道,反正感觉挺强大的
< libcurl is a free and easy-to-use client-side URL transfer library, supporting DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP.
须知,我这里只用到了HTTP
document: https://curl.haxx.se/libcurl/
其实使用比较简单,但对我没有认真看过文档,并且没有找到好资料的情况下,我遇到了很多弯路,并且想吐槽实例代码,搞那么复杂干嘛,还没有我想要的代码。
下面开始坑。
0x01. 就这么简单
1 | /* curl stuff */ |
简单应用就是这样子,关键在这两句1
2
3curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");
/* Now specify the POST data */
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");
liburl通过设置各种回调函数来完成各种功能。
0x02. http请求
CURLOPT_URL : 访问的目标url路径,如果是GET方式请求,需要将请求数据加到URL后面
1 | www.baidu.com/login.asp?name=111&password=111 |
CURLOPT_POSTFIELDS : POST请求中发送的数据
1 | curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl"); |
并且POST请求中还需要设置CURLOPT_POST为1
1 | /* size of the POST data */ |
另外,奇葩的1
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); //url在release可正常使用,debug去不行,只能使用url.c_str();
0x03. 接收数据
接收数据需要注册CURLOPT_WRITEFUNCTION回调函数,在回调函数中进行数据处理
1 | curl_easy_setopt(*curl, CURLOPT_WRITEFUNCTION, write_callback); |
如果数据不能一次接收完成,需要利用回调中的参数来缓存数据,也就是通过CURLOPT_WRITEDATA设置
1 | curl_easy_setopt(*curl, CURLOPT_WRITEDATA, data); |
回调函数处理中,最后一次参数就是设置的用于缓存的变量,需要注意的是数据长度,不是size,而是size*nmemb
。 并且如果返回值不等于size*nmemb,libcurl会认为处理失败
1 | size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata) |
0x04. cookie
通过cookie文件保存,读取cookie
1 | curl_easy_setopt(*curl, CURLOPT_COOKIEJAR, "cookie.txt"); //把服务器发过来的cookie保存到cookie.txt |
直接设置cookie信息
1 | //curl_easy_setopt(curl, CURLOPT_COOKIE, m_cookies.c_str()); |
0x05. 一点点分析
下面是遇到坑时的一小点点源码翻阅,觉得有用的可以看看
1. curl_easy_setopt调用中
1 | //curl_easy_setopt调用中 |
2. 请求中
1 | CURLcode curl_easy_perform(struct Curl_easy *data)//lib/easy.c |
3. 接受数据时
1 | static CURLMcode multi_runsingle(struct Curl_multi *multi, |
4. cookie相关
1 | //解析指定的cookie文件 |
0x06. 其他
封装了一份简单的http类,支持GET、POST、ajax,代码比较简单,有需要的可以拿来用,后续可能会更新
源码:https://github.com/anhkgg/minihttp
https://curl.haxx.se/libcurl/3