一、 概念
1. 為什麼要使用libcurl
1) 作為http的用戶端,可以直接用socket連接配接伺服器,然後對到的資料進行http解析,但要分析協定頭,實作代理…這樣太麻煩了。
2) libcurl是一個開源的用戶端url傳輸庫,支援 FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,支援 Windows,Unix,Linux等平台,簡單易用,且庫檔案占用空間不到200K
2. get和post方式
用戶端在http連接配接時向服務送出資料的方式分為get和post兩種
1) Get方式将所要傳輸的資料附在網址後面,然後一起送達伺服器,它的優點是效率比較高;缺點是安全性差、資料不超過1024個字元、必須是7位的ASCII編碼;查詢時經常用此方法。
2) Post通過Http post處理發送資料,它的優點是安全性較強、支援資料量大、支援字元多;缺點是效率相對低;編輯修改時多使用此方法。
3. cookie與session
1) cookie
cookie是發送到客戶浏覽器的文本串句柄,并儲存在客戶機硬碟上,可以用來在某個Web站點會話之間持久地保持資料。cookie在用戶端。
2) session
session是通路者從到達某個特定首頁到離開為止的那段時間。每一通路者都會單獨獲得一個session,實作站點多個使用者之間在所有頁面中共享資訊。session在伺服器上。
3) libcurl中使用cookie
儲存cookie, 使之後的連結與此連結使用相同的cookie
a) 在關閉連結的時候把cookie寫入指定的檔案
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, “/tmp/cookie.txt”);
b) 取用現在有的cookie,而不重新得到cookie
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, “/tmp/cookie.txt”);
b) http與https的差別
1) Http是明文發送,任何人都可以攔截并讀取内容
2) Https是加密傳輸協定,用它傳輸的内容都是加密過的,https是http的擴充,其安全基礎是SSL協定
c) base64編碼
1) 為什麼要使用base64編碼
如果要傳一段包含特殊字元比較多的資料,直接上傳就需要處理轉意符之類的很多問題,用base64編碼,它可以把資料轉成可讀的字串,base64由a-z, A-Z, +/總計64個字元組成。
2) 傳送base64編碼的注意事項
由于base64的組成部分有加号,而加号是url中的轉意字元,是以無論是get方式還是post,傳到伺服器的過程中,都會把加号轉成空格,是以在傳base64之前需要把base64編碼後的加号替換成”+”,這樣就可以正常發送了。
二、 例程
d) 代碼
#include <stdio.h>
#include <curl/curl.h>
bool getUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, “w”)) == NULL) // 傳回結果用檔案存儲
return false;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, “Accept: Agent-007″);
curl = curl_easy_init(); // 初始化
if (curl)
{
curl_easy_setopt(curl, CURLOPT_PROXY, “10.99.60.201:8080″);// 代理
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改協定頭
curl_easy_setopt(curl, CURLOPT_URL, “http://www.google.com/search?hl=en&q=xieyan0811&btnG=Google+Search&aq=f&oq=xieyan081″);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl); // 執行
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
bool postUrl(char *filename)
if ((fp = fopen(filename, “w”)) == NULL)
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, “/tmp/cookie.txt”); // 指定cookie檔案
// curl_easy_setopt(curl, CURLOPT_COOKIEJAR, “/tmp/cookie.txt”);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, “&logintype=uid&u=xieyan&psw=xxx86″); // 指定post内容
curl_easy_setopt(curl, CURLOPT_PROXY, “10.99.60.201:8080″);
curl_easy_setopt(curl, CURLOPT_URL, “http://mail.sina.com.cn/cgi-bin/login.cgi”); // 指定url
res = curl_easy_perform(curl);
int main(void)
getUrl(“/tmp/get.html”);
postUrl(“/tmp/post.html”);