libcurl基本知識、post、get請求 -- libcurl
阿新 • • 發佈:2019-01-25
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客戶端程式碼等,相當麻煩。
(1)Get方式將所要傳輸的資料附在網址後面,然後一起送達伺服器,它的優點是效率比較高;缺點是安全性差、資料不超過1024個字元(未必)、必須是7位的ASCII編碼;查詢時經常用此方法。#按照我的理解get和post都支援無限資料傳輸,1024是伺服器對get請求的限制,並不是客戶端只能穿這個;對於安全性,get和post都可以採用加密後再傳輸資料。
(2)Post通過Http post處理髮送資料,它的優點是安全性較強、支援資料量大、支援字元多;缺點是效率相對低;編輯修改時多使用此方法。
(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");
(1)如果要傳一段包含特殊字元比較多的資料,直接上傳就需要處理轉意符之類的很多問題,用base64編碼,它可以把資料轉成可讀的字串,base64由a-z, A-Z, +/總計64個字元組成。
(2)由於base64的組成部分有加號,而加號是url中的轉意字元,所以無論是get方式還是post,傳到伺服器的過程中,都會把加號轉成空格,所以在傳base64之前需要把base64編碼後的加號替換成”%2B”,這樣就可以正常傳送了。#web端常使用對特殊字元的轉義,base64是為了讓字元流明文可見的方式傳輸。
程式碼例程
(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 #這個屬於網頁端的一些理解了,不細說了
(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");
}