標籤:
最近在學習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 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);
- }
[c] view plaincopy
- #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 說下這當中的一些操作吧
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請求