1. 程式人生 > >libcurl基本知識、post、get請求 -- libcurl

libcurl基本知識、post、get請求 -- libcurl

1、為什麼要使用libcurl,
(1)作為http的客戶端,可以直接用socket連線伺服器,然後對到的資料進行http解析,但要分析協議頭,實現代理…這樣太麻煩了。#也就是socket連線然後發post、get協議包,自己組包和拆包。
(2)libcurl是一個開源的客戶端url傳輸庫,支援FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,支援Windows,Unix,Linux等平臺,簡單易用,且庫檔案佔用空間不到200K。#我覺得curl庫是非常強大,以前用過ghttp支援客戶端http get post請求,ftp客戶端程式碼等,相當麻煩。

2、get和post方式

客戶端在http連線時向服務提交資料的方式分為get和post兩種
(1)Get方式將所要傳輸的資料附在網址後面,然後一起送達伺服器,它的優點是效率比較高;缺點是安全性差、資料不超過1024個字元(未必)、必須是7位的ASCII編碼;查詢時經常用此方法。#按照我的理解get和post都支援無限資料傳輸,1024是伺服器對get請求的限制,並不是客戶端只能穿這個;對於安全性,get和post都可以採用加密後再傳輸資料。
(2)Post通過Http post處理髮送資料,它的優點是安全性較強、支援資料量大、支援字元多;缺點是效率相對低;編輯修改時多使用此方法。

3、cookie與session

#這個屬於網頁端的一些理解了,不細說了

(1)cookie是傳送到客戶瀏覽器的文字串控制代碼,並儲存在客戶機硬碟上,可以用來在某個Web站點會話之間持久地保持資料。cookie在客戶端。
(2)session是訪問者從到達某個特定主頁到離開為止的那段時間。每一訪問者都會單獨獲得一個session,實現站點多個使用者之間在所有頁面中共享資訊。session在伺服器上。
(3)libcurl中使用cookie,儲存cookie, 使之後的連結與此連結使用相同的cookie
(3.1)在關閉連結的時候把cookie寫入指定的檔案:  curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookie.txt");

(3.2)取用現在有的cookie,而不重新得到cookie:  curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt");

4、http與https的區別

(1)Http是明文傳送,任何人都可以攔截並讀取內容

(2)Https是加密傳輸協議,用它傳輸的內容都是加密過的,https是http的擴充套件,其安全基礎是SSL協議 #協議層理解,多了一層對資料的加密,加密方式是SSL加密,應該是公鑰和私鑰的理解。

5、base64編碼
(1)如果要傳一段包含特殊字元比較多的資料,直接上傳就需要處理轉意符之類的很多問題,用base64編碼,它可以把資料轉成可讀的字串,base64由a-z, A-Z, +/總計64個字元組成。
(2)由於base64的組成部分有加號,而加號是url中的轉意字元,所以無論是get方式還是post,傳到伺服器的過程中,都會把加號轉成空格,所以在傳base64之前需要把base64編碼後的加號替換成”%2B”,這樣就可以正常傳送了。#web端常使用對特殊字元的轉義,base64是為了讓字元流明文可見的方式傳輸。

6、curl_setop()函式中的引數中文說明

curl_setopt()函式將為一個CURL會話設定選項。option引數是你想要的設定,value是這個選項給定的值。下列選項的值將被作為長整形使用(在option引數中指定)
程式碼例程
#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)
{
    CURL *curl;
    CURLcode res;
    FILE *fp;
    if ((fp = fopen(filename, "w")) == NULL)
         return false;
    curl = curl_easy_init();
    if (curl)
    {
         curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie檔案
         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
         curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
         res = curl_easy_perform(curl);
         curl_easy_cleanup(curl);
    }
    fclose(fp);
    return true;
}
int main(void)
{
    getUrl("/tmp/get.html");
    postUrl("/tmp/post.html");
}