1. 程式人生 > >關於http協議的描述和curl使用詳解

關於http協議的描述和curl使用詳解

1、HTTP協議的理解:

1.1 首先提供幾個自己在開發過程中查閱的網站

·http://blog.csdn.net/kingcodexl/article/details/51306062
·https://developer.mozilla.org/zh-CN/docs/Web
主要了解HTTP的報文格式以及頭域的意義。

1.2 HTTP協議的請求方法

HTTP 定義了一組請求方法, 以表明要對給定資源執行的操作。指示針對給定資源要執行的期望動作. 雖然他們也可以是名詞, 但這些請求方法有時被稱為HTTP動詞. 每一個請求方法都實現了不同的語義, 但一些共同的特徵由一組共享:: 例如一個請求方法可以是 safe, idempotent, 或 cacheable.
·GET:GET方法請求一個指定資源的表示形式. 使用GET的請求應該只被用於獲取資料.
·HEAD:HEAD方法請求一個與GET請求的響應相同的響應,但沒有響應體只獲取響應資訊的響應頭資訊.
·POST:POST方法用於將實體提交到指定的資源,通常導致狀態或伺服器上的副作用的更改,通俗就是上傳檔案到伺服器. 
·PUT:PUT方法用請求有效載荷替換目標資源的所有當前表示。
·DELETE:DELETE方法刪除指定的資源。
·CONNECT:CONNECT方法建立一個到由目標資源標識的伺服器的隧道。
·OPTIONS:OPTIONS方法用於描述目標資源的通訊選項。
·TRACE:TRACE方法沿著到目標資源的路徑執行一個訊息環回測試。
·PATCH:PATCH方法用於對資源應用部分修改。
(具體的方法怎麼使用可以上網查)

1.3 HTTP協議的認證方法(主要解釋基本認證 Basic authentication和摘要認證Digest authentication)

·基本認證Basec:是一種用來允許Web瀏覽器或其他客戶端程式在請求時提供使用者名稱和口令形式的身份憑證的一種登入驗證方式。
 把 "使用者名稱+冒號+密碼"用BASE64演算法加密後的字串放在http request 中的header Authorization中傳送給服務端。
 客戶端對於每一個realm,通過提供使用者名稱和密碼來進行認證的方式。
 包含密碼的明文傳遞。
例:
客戶端請求:
GET / HTTP/1.1
Host: localhost
Authorization: Basic dG9tOjEyMzQ1Ng
伺服器響應(認證成功):
HTTP/1.1 200 OK
Date: Thu, 13 Jun 2013 20:25:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 53
伺服器響應(認證失敗):
HTTP/1.1 401 Authorization Required
Date: Thu, 13 Jun 2013 20:25:37 GMT
WWW-Authenticate: Basic realm="Users"
·摘要認證Digest:摘要認證是要與伺服器至少有兩次互動的,首先是傳送POST請求,伺服器會返回401狀態碼認證響應,響應中會
 有待認證的資訊(WWW-Authenticate),客戶端根據伺服器響應組織認證報文,一般是使用雜湊演算法返回一個Response頭域資訊,若認證通過伺服器會返
 回200狀態碼通過。
例:
客戶端請求:
POST / HTTP/1.1
Host: localhost
伺服器響應:
HTTP/1.1 401 Authorization Required
Date: Thu, 13 Jun 2013 20:25:37 GMT
WWW-Authenticate: Digest realm="Hi!", nonce="HSfb5dy15hKejXAbZ2VXjVbgNC8sC1Gq", qop="auth"
客戶端認證;
POST / HTTP/1.1
Host: localhost
Authorization: Digest username="tom",
 realm="Hi!",
 nonce="L4qfzASytyQJAC2B1Lvy2llPpj9R8Jd3",
 uri="/",
 qop=auth,
 nc=00000001,
 cnonce="c2dc5b32ad69187a",         
伺服器響應;
HTTP/1.1 200 OK
Date: Thu, 13 Jun 2013 20:25:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 53
(這些演算法過程我們可以借用HTTP開源庫解決,後面做描述)


2、心跳保活機制:

2.1 簡單來說,心跳保活就是在一定時間內傳送心跳保活包給對端,以防對端掉線資源未釋放,浪費資源。
這個我們可以自己實現定時傳送心跳包,最簡單的就是使用HTTP開源庫設定傳送心跳包的時間。


3、斷點續傳

3.1 斷點續傳主要是客戶端意外的掉線,連線上後依然接著上次傳輸的位置繼續傳輸,實現斷點續傳一般
先發送報文獲取上次斷點的位置,伺服器會在Content-Length中說明斷點的位置,客戶端再設定Content-Rang
來接著上次斷點的位置接著傳輸資料。
3.2 PU2GASG我們是使用HTTP開源庫解決的。


4、接下就是關鍵了,HTTP的開源庫libcurl,可以自己在網站上下載:

4.1 curl是開發HTTP協議的程式的開源庫,首先提供一個網站:

https://curl.haxx.se/libcurl/c/libcurl.html
網站中有對curl庫的使用手冊以及一些函式的使用Demo

4.2 介紹幾個常用的函式

·curl_global_init
 這個函式設定程式環境libcurl的需要。認為它是一個擴充套件庫的載入程式,簡單想就是一個初始化函式,它有一些巨集,看需要使用,此案例使用的是 CURL_GLOBAL_ALL。
·curl_easy_init
 這個函式是你必須呼叫的介面,它返回的控制代碼是用來設定報文頭域屬性的,沒有它你將無法設定報文,這個呼叫必須有一個相應的呼叫curl_easy_cleanup當操作完成。
·curl_slist_append
 官方有專業的解釋,但是我看的不太懂,我的理解是自定義設定報文頭域,比如設定Content-Type:image/jpeg,注意使用該函式後需要使用curl_easy_setopt將其新增到報文頭域中,使用完成後使用curl_slist_free_all函式釋放資源。
·curl_easy_setopt
 這個函式就厲害了,你必須用到它,它涉及的巨集特別多,看需求使用響應的巨集,但是有一個巨集你是必須使用的,那就是設定URL的巨集,在此我們提供幾個常用的巨集:
CURLOPT_URL:設定需要訪問的地址,一般是由I“IP+路勁”或者“域名+路勁”
CURLOPT_HTTPHEADER:將自定義的頭域新增到報文中,第三個引數是curl_easy_append的返回值
CURLOPT_WRITEFUNCTION:設定讀取伺服器響應資料的回撥函式
CURLOPT_WRITEDATA:設定傳遞給讀取伺服器響應資料的回撥函式的唯一引數
CURLOPT_READFUNCTION:設定上傳資料到伺服器的回撥函式
CURLOPT_READDATA:設定傳遞給上傳資料到伺服器的回撥函式的唯一引數
CURLOPT_HEADERFUNCTION:設定只接收報文頭資訊的回撥函式
CURLOPT_HEADERDATA:傳遞給接收報文頭資訊的回撥函式的唯一引數
CURLOPT_NOBODY:設定只接受報文頭資訊
CURLOPT_POST:設定請求方式為POST
CURLOPT_HTTPAUTH:設定認證方式,使用這個巨集之後函式的第三個函式設定你所要認證的方式
CURLOPT_USERPWD:設定使用者名稱和密碼
CURLOPT_TCP_KEEPALIVE、CURLOPT_TCP_KEEPIDLE、CURLOPT_TCP_KEEPINTVL:這三個巨集一般在一起用,設定keepalive的,具體看官網描述
CURLOPT_POSTFIELDS:設定上傳資料的緩衝
CURLOPT_POSTFIELDSIZE:設定上傳資料的大小
CURLOPT_RANGE:設定Content-Rang的範圍
CURLOPT_INFILESIZE_LARGE:設定Content-Rang屬性後面的檔案總大小
巨集還有很多,需要什麼用什麼,但是想要完全理解需要花一點時間。
·curl_easy_perform
 這個函式是將我們已經設定好的報文傳送過去,根據返回值可以判斷出錯資訊
·curl_easy_getinfo
 這個函式是獲取請求或響應報文中特定資訊,也是有很多的巨集,根據需要選擇響應的巨集,例:CURLINFO_RESPONSE_CODE獲取伺服器響應的狀態碼
·curl_slist_free_all
 不做多的解釋,就是和curl_slist_append函式連用,釋放資源
·curl_easy_cleanup
 釋放資源