使用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代碼

- #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);
- }
- #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的名字~