http://blog.csdn.net/zengraoli/article/details/11522563 2013 最近在學(xué)習(xí)libcurl,,并利用它提交POST請(qǐng)求,,可是返回的響應(yīng)總是無從驗(yàn)證該次POST請(qǐng)求是否成功提交了,。
1. 先看下根據(jù)firebug提交的一次成功的請(qǐng)求,,這里以login我喜歡上的xiami為例,,嘻嘻~
1.1 本次POST請(qǐng)求的HTTP交互
1.2 POST
1.3 經(jīng)server端redirect的GET
2. OK,,接下來看下使用libcurl向xiami發(fā)送POST請(qǐng)求
2.1 使用libcurl的大概流程
curl_easy_init()
curl_easy_setopt()
curl_easy_perform()
curl_easy_cleanup()
呵呵~超簡(jiǎn)單的吧,具體的意思這里就不詳細(xì)說了,,參見http://curl./libcurl/c/
2.2 再來看簡(jiǎn)單的代碼
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <curl/curl.h>
-
- #define POSTURL "http://www.xiami.com/member/login"
- #define POSTFIELDS "[email protected]&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 說下這當(dāng)中的一些操作吧
CURLOPT_URL: URL地址
CURLOPT_POSTFIELDS: POST參數(shù)
CURLOPT_WRITEFUNCTION: 對(duì)返回的數(shù)據(jù)進(jìn)行操作的函數(shù)地址
CURLOPT_WRITEDATA: 設(shè)置WRITEFUNCTION的第四個(gè)參數(shù)值
CURLOPT_POST: 設(shè)置為非0表示本次操作為POST
CURLOPT_VERBOSE: 設(shè)置為非0在執(zhí)行時(shí)打印請(qǐng)求信息
CURLOPT_HEADER: 設(shè)置為非0將響應(yīng)頭信息同響應(yīng)體一起傳給WRITEFUNCTION
CURLOPT_FOLLOWLOCATION: 設(shè)置為非0,,響應(yīng)頭信息Location
CURLOPT_COOKIEFILE: 哈哈,這個(gè)實(shí)在是太重要了,,我之前嘗試了好多次沒法驗(yàn)證該次POST是否成功的原因就是沒有設(shè)置這個(gè)羅,。設(shè)置對(duì)應(yīng)的COOKIEFILE路徑,該路徑文件并不一定需要在物理磁盤上實(shí)際存在
2.4 接下來是成功返回的結(jié)果哦,,呵呵,,下面截圖當(dāng)中的zhuzhu可以為證,不好意思,,xiami上取了個(gè)比較CUO的名字~
轉(zhuǎn)自:http://finux./blog/715247
|