最近在学习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的名字~
分享到:
相关推荐
为了提交POST表单数据,你需要使用`curl_easy_setopt()`函数设置请求方法为POST,并提供POST字段数据。例如,如果表单有一个名为`username`的字段和一个名为`password`的字段,你可以这样做: ```cpp if(curl) { ...
c++版的带json实体的post请求,本人使用vs2015搭建了项目,压缩包内包括所有的文件,可以直接运行,如有问题请联系邮件zhangxin.lyl@gmail.com,具体libcurl的配置和json的配置见个人博客
首先,`con_test.cpp`是主要的源代码文件,它包含了使用libcurl进行文件上传和POST操作的具体实现。`StdAfx.cpp`和`StdAfx.h`是Visual Studio项目中的预编译头文件,用于提高编译速度。`con_test.dsp`和`con_test....
以下是一个简单的示例,展示了如何使用libcurl异步并发地发送POST请求: 1. 初始化多会话句柄: ```cpp CURLM* multi_handle = curl_multi_init(); ``` 2. 创建并添加单个curl会话: ```cpp CURL* easy_handle = ...
在给定的`MFCApplication2`项目中,我们可以看到这是一个基于Visual Studio 2013的MFC应用,可能包含了完整的代码示例,演示了如何在MFC环境中使用libcurl进行POST请求。MFC(Microsoft Foundation Classes)是微软...
GET请求通常用于获取资源,而POST请求用于提交数据到服务器进行处理。本篇文章将深入探讨如何在C++中实现HTTP POST和GET请求,并介绍在调试过程中使用第三方库libcurl以及网络封包分析工具Wireshark。 1. **C++中的...
本文将详细介绍如何使用C++来实现HTTP POST请求,并通过具体的代码示例来解释这一过程。 #### 二、HTTP POST 方法简介 POST是HTTP协议中的一个标准方法,用于向指定资源提交数据进行处理请求(例如提交表单或者上传...
以下是一个简单的C语言代码示例,展示了如何使用libcurl发起POST请求: ```c #include #include void perform_post_request(const char* url, const char* json_data) { CURL *curl; CURLcode res; curl_...
POST请求则常用于向服务器提交数据,如表单提交。POST请求的数据包含在请求体中,而非URL。C++实现POST请求时,除了构造请求头,还需添加Content-Length字段表示请求体的长度,以及实际的请求体内容: ```cpp void ...
POST请求常用于向服务器提交数据。与GET类似,但需额外提供POST数据。以下是实现POST请求的步骤: 1. 创建`CHttpFile`对象时,除了URL,还需要提供POST数据的名称和值。 2. 在`SendRequest`之前,调用`...
在示例工程中,开发者可能会展示如何使用libcurl发送HTTP GET请求获取网页内容,或者发送POST请求提交表单数据。 **CurlTest项目** 压缩包中的"CurlTest"很可能是一个包含了使用libcurl的示例代码的项目文件。这个...
POST请求通常用于提交表单数据或上传文件。与GET类似,首先初始化CURL句柄,但这次需要设置POST字段和POST数据类型。可以使用`curl_easy_setopt()`设置`CURLOPT_POSTFIELDS`选项传递POST数据。如果数据来自结构化...
5. **POST请求**:通过设置`CURLOPT_POSTFIELDS`,可以发起POST请求,将数据提交到服务器。 6. **上传下载进度监控**:`curl_easy_setopt`可以设置回调函数来跟踪上传和下载进度。 7. **代理支持**:libcurl允许...
在libcurl中,你需要设置`CURLOPT_POSTFIELDS`选项,提供POST数据,并可能设置`CURLOPT_POST`选项为1,指示这是一个POST请求。 3. **PUT**:PUT方法用于替换服务器上的现有资源,或者创建新资源(如果不存在)。在...
POST请求则常用于向服务器提交数据,例如表单提交。POST请求可以携带大量数据,其数据隐藏在请求体中,相对安全,但并非绝对。POST请求不是幂等的,连续执行两次可能会产生不同的结果,比如创建两个独立的资源。 ...
libcurl通过`CURLOPT_POSTFIELDS`等选项设置POST数据,并可以处理MIME类型和其他表单属性。 **lib、dll、include文件** 在提供的压缩包中,`lib`文件夹通常包含编译好的libcurl库文件,这些文件在编译应用时需要...
libcurl提供了便捷的API接口,使得开发者可以方便地模拟这种行为,进行POST请求,将表单数据发送到指定的URL。 使用libcurl库,开发者可以编写跨平台的应用程序,因为它在多种操作系统上都有良好的支持,包括...
2. **POST数据提交**:使用`CURLOPT_POSTFIELDS`设置POST数据,`CURLOPT_HTTPPOST`启用POST操作。 3. **上传文件**:结合`CURLOPT_UPLOAD`和`CURLOPT_READFUNCTION`,可以从内存或文件读取数据进行FTP或HTTP上传。 ...
为了适应现代网页登录,你可能需要使用额外的库如`libcurl_easy`的扩展`libcurl_formadd`来处理复杂的POST数据,或者使用像`libcurl_multi`来同时处理多个请求,以应对登录过程中可能出现的异步操作。 还要注意,...