使用libcurl提交POST请求

最近在学习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 再来看简单的代码

C代码  

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <string.h>   
  4. #include <curl/curl.h>   
  5.   
  6. #define POSTURL "http://www.xiami.com/member/login"   
  7. #define POSTFIELDS "email=myemail@163.com&password=mypassword&autologin=1&submit=登 录&type="   
  8. #define FILENAME "curlposttest.log"   
  9.   
  10. size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);   
  11.   
  12. int main(int argc, char *argv[]) {   
  13.     CURL *curl;   
  14.     CURLcode res;   
  15.     FILE *fptr;   
  16.     struct curl_slist *http_header = NULL;   
  17.   
  18.     if ((fptr = fopen(FILENAME, "w")) == NULL) {   
  19.         fprintf(stderr, "fopen file error: %s\n", FILENAME);   
  20.         exit(1);   
  21.     }   
  22.   
  23.     curl = curl_easy_init();   
  24.     curl_easy_setopt(curl, CURLOPT_URL, POSTURL);   
  25.     curl_easy_setopt(curl, CURLOPT_POSTFIELDS, POSTFIELDS);   
  26.     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);   
  27.     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fptr);   
  28.     curl_easy_setopt(curl, CURLOPT_POST, 1);   
  29.     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);   
  30.     curl_easy_setopt(curl, CURLOPT_HEADER, 1);   
  31.     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);   
  32.     curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/Users/zhu/CProjects/curlposttest.cookie");   
  33.     res = curl_easy_perform(curl);   
  34.     curl_easy_cleanup(curl);   
  35. }   
  36.   
  37. size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp) {   
  38.     FILE *fptr = (FILE*)userp;   
  39.     fwrite(buffer, size, nmemb, fptr);   
  40. }  

[c] view plaincopy

 

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <curl/curl.h>  
  5.   
  6. #define POSTURL "http://www.xiami.com/member/login"  
  7. #define POSTFIELDS "email=myemail@163.com&password=mypassword&autologin=1&submit=登 录&type="  
  8. #define FILENAME "curlposttest.log"  
  9.   
  10. size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);  
  11.   
  12. int main(int argc, char *argv[]) {  
  13.     CURL *curl;  
  14.     CURLcode res;  
  15.     FILE *fptr;  
  16.     struct curl_slist *http_header = NULL;  
  17.   
  18.     if ((fptr = fopen(FILENAME, "w")) == NULL) {  
  19.         fprintf(stderr, "fopen file error: %s\n", FILENAME);  
  20.         exit(1);  
  21.     }  
  22.   
  23.     curl = curl_easy_init();  
  24.     curl_easy_setopt(curl, CURLOPT_URL, POSTURL);  
  25.     curl_easy_setopt(curl, CURLOPT_POSTFIELDS, POSTFIELDS);  
  26.     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);  
  27.     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fptr);  
  28.     curl_easy_setopt(curl, CURLOPT_POST, 1);  
  29.     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
  30.     curl_easy_setopt(curl, CURLOPT_HEADER, 1);  
  31.     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);  
  32.     curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/Users/zhu/CProjects/curlposttest.cookie");  
  33.     res = curl_easy_perform(curl);  
  34.     curl_easy_cleanup(curl);  
  35. }  
  36.   
  37. size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp) {  
  38.     FILE *fptr = (FILE*)userp;  
  39.     fwrite(buffer, size, nmemb, fptr);  
  40. }  

 

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的名字~

 

时间: 2024-12-28 21:36:32

使用libcurl提交POST请求的相关文章

struts-急求使用jquery提交的请求回调函数接收不到后台返回值解决办法

问题描述 急求使用jquery提交的请求回调函数接收不到后台返回值解决办法 $.ajax({ type: "post", url: uri, async:true, data: data, success: function (result) { $("#showrecord").append(result); }, error:function(XMLResponse){ alert("wait a minute"); } }); 后台: Ht

httpentity-Android提交post请求上传图片,Java如何获取HttpEntity里面的东西

问题描述 Android提交post请求上传图片,Java如何获取HttpEntity里面的东西 Android端发送post请求,上传图片,把byte[]弄到HttpEntity里面. ByteArrayOutputStream bos = new ByteArrayOutputStream(); file.compress(Bitmap.CompressFormat.PNG, 100, bos); byte[] body = bos.toByteArray(); HttpEntity ent

httpclient提交一个请求返回的都是200的状态码,如何判断怎么是成功的怎么是失败的

问题描述 httpclient提交一个请求返回的都是200的状态码,如何判断怎么是成功的怎么是失败的 httpclient提交一个用于登录的请求,但是返回的都是200的状态码,如何判断怎么是成功的怎么是失败的呢? 解决方案 已解决,原因是由于学校的教务网出现问题了,才导致模拟不成功 解决方案二: 返回200说明在http层面都是成功的.你说的失败应该是指返回的数据中包含错误信息,那么你需要对返回的数据进行判断. 解决方案三: 如果返回的是200的话,那就是成功的!否则就是失败的! 解决方案四:

libcurl提交表单上传文件

不多说了,curl的http上传文件代码示例,有需要的可以参考.   int http_post_file(const char *url, const char *user, const char *pwd, const char *filename){    assert(url != NULL);    assert(user != NULL);    assert(pwd != NULL);    assert(filename != NULL);     int ret = -1;  

javascript如何监听form 表单提交请求?

问题描述 javascript如何监听form 表单提交请求? 前端form 表单提交请求如何监听?就像ajax请求可以通过xmlHttpRquest对象去监听所有的ajax请求,对其中的参数做一层包装再发送到后台,后台返回的数据也可以在此处做一次封装再发给指定的页面一样,但是xmlHttpRquest捕捉不到form表单提交的请求,请问各位大神form表单提交的请求前端如何捕获? 解决方案 表单的onsubmit事件,或者给input为submit的类型添加onclick事件也行,返回fals

按钮-C# HTTP请求 网页POST提交

问题描述 C# HTTP请求 网页POST提交 用C#窗体程序模拟提交HTTP请求,被提交的网页上的一段代码 <input type="text" id="web_input" class="inputon" > <a href="javascript:;" id="web_button"><img src="guestbook.gif" width=&qu

JS Ajax请求如何防止重复提交_javascript技巧

好长时间没写js代码了刚好遇到这样的问题.我们系统多数表单没有做防止重复提交的. 由于不想在后端这边处理,因为假如由后端处理的话,就需要在页面加载的时候给出一次性的token值,加大了开发的工作量不说,还容易忘记做这个,同时,ajax也不好处理,需要提交失败的话同时返回新的token值. 所以我想在,js这边动手.其实以前和前端提过,久久不见动静,就只好弄块砖丢出去了.思路是,覆盖掉$.ajax,在这里面处理掉防止重复提交的问题,而前端的业务开发不受影响,不改代码,无感知. 我想架构的目的之一,

按钮的Ajax请求时一次点击两次提交的解决方法_AJAX相关

页面中的按钮的type是submit的: <input type="submit" value="Create" id="submit" /> ajax的请求,在JQuery中是: $(function () { $('#submit').click(function () { var createGenreForm = $('#createGenreForm'); if (createGenreForm.valid()) { var

【CURL (LIBCURL) 开发 之一】COCOS2DX之LIBCURL(CURL_EASY)的编程教程(帮助手册)!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/curl-libcurl/878.html      注意:如果你的服务器是Java的,那么要注意数据之间的大端小端的处理:否则无法正常获取正确的数据! 本篇介绍使用libcurl编程的一般原则和一些基本方法.本文主要是介绍 c 语言的调用接口,同时也可能很好的适用于其他类 c 语言的接口. 跨平台的可移植代码 libcurl库背后的开发人员