最近在学习libcurl,并利用它提交POST请求,可是返回的响应总是无从验证该次POST请求是否成功提交了。
1. 先看下根据firebug提交的一次成功的请求,这里以login我喜欢上的xiami为例,嘻嘻~
1.1 本次POST请求的HTTP交互
1.2 POST
1.3 经server端redirect的GET
2. OK,接下来看下使用libcurl向xiami发送POST请求
2.1 使用libcurl的大概流程
curl_easy_init()
curl_easy_setopt()
curl_easy_perform()
curl_easy_cleanup()
呵呵~超简单的吧,具体的意思这里就不详细说了,参见http://curl.haxx.se/libcurl/c/
2.2 再来看简单的代码
#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);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fptr);
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/Users/zhu/CProjects/curlposttest.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.3 说下这当中的一些操作吧
CURLOPT_URL: URL地址
CURLOPT_POSTFIELDS: POST参数
CURLOPT_WRITEFUNCTION: 对返回的数据进行操作的函数地址
CURLOPT_WRITEDATA: 设置WRITEFUNCTION的第四个参数值
CURLOPT_POST: 设置为非0表示本次操作为POST
CURLOPT_VERBOSE: 设置为非0在执行时打印请求信息
CURLOPT_HEADER: 设置为非0将响应头信息同响应体一起传给WRITEFUNCTION
CURLOPT_FOLLOWLOCATION: 设置为非0,响应头信息Location
CURLOPT_COOKIEFILE: 哈哈,这个实在是太重要了,我之前尝试了好多次没法验证该次POST是否成功的原因就是没有设置这个罗。设置对应的COOKIEFILE路径,该路径文件并不一定需要在物理磁盘上实际存在
2.4 接下来是成功返回的结果哦,呵呵,下面截图当中的zhuzhu可以为证,不好意思,xiami上取了个比较CUO的名字~
分享到:
相关推荐
libcurl 提交post表单数据 上传图片 demo 根据网页请求协议,模拟post表单的方式上传数据,并最返回数据进行处理
c++版的带json实体的post请求,本人使用vs2015搭建了项目,压缩包内包括所有的文件,可以直接运行,如有问题请联系邮件zhangxin.lyl@gmail.com,具体libcurl的配置和json的配置见个人博客
window上使用openssl和libcurl发送https的post请求 并使用MD5和base64加密的工程,包含自己编译的openssl和libcurl静态库文件,可直接使用,详情可以看一下readme文件
这个小程序只是简单的使用线程池实现了libcurl的异步请求功能,很多地方还需要优化,之所有厚颜上传到这里,主要有有三个目的。 一个是回报这些天在CSDN上得到的帮助,希望可以帮助到后来的人; 二是感于libcurl编译...
用form-data 表单形式发送数据,并且上传文件,完整示例,使用libcurl提供的API上传文件。项目使用Vc++ 6.0 和 VS 2017同时编译通过,上传表单数据和文件测试成功。
libcurl 以表单模式post。VS2013.代码齐全。里面有JSON库已经libcurl的库
包含两部分,一是python模拟的简单服务器,用于回应post和get请求;二是C++部分,利用libcurl库发送jsoncpp库写的json文件.内有readme,有问题请私信.
c++ 发送https POST请求并获取返回数据(包含appKey与appSecret)
libcurl 以JSON模式post。VS2013.代码齐全。里面有JSON库已经libcurl的库
c++使用libcurl上传和下载资源,封装了库,带lib文件,带nodejs测试服务端
Typhoeus封装libcurl让http请求更快和可靠
将GET和POST整理成http_get和http_post两个函数方便使用,一句话即可调用。详细使用方式:https://blog.csdn.net/suiyingy/article/details/122365449
基于libcurl实现http post支持并发,异步 方便新手学习
用于c++发送post请求的封装库,底层调用libcurl,使用格式类似python rest,更加便捷
本文档描述了如何使用libcurl连接https服务器
所以,使用libcurl,可以很简单的完成HTTP的下载工作,为HLS模块的拉流部分提供简单有效的HTTP请求方法。 想要知道更多关于libcurl的介绍,可以到官网 上去了解,在这里不再详述。(官网地址 http://curl.haxx.se/)...
Windows下VS2015编译并使用libcurl.lib静态库1111111111
使用libcurl获取经过gzip压缩的网页文件,配合我的文章http://blog.csdn.net/zengraoli/article/details/13623237 使用
Android监听卸载后用libcurl三方库进行请求源码