1. 程式人生 > 實用技巧 >使用HttpClient 獲取第三方介面返回結果

使用HttpClient 獲取第三方介面返回結果

1. HTTP協議

1.1 HTTP協議概述

1)協議型別

HTTP:Hyper Text Transfer Protocol

應用層協議,文字協議

佔據端:80/tcp

http協議是無狀態的(stateless),伺服器無法持續追蹤訪問者來源,但我們可以通過cookie、session來實現此功能。

2)協議版本

http/0.9:原型版本,功能簡陋

http/1.0:cache、MIME、method

  • MIME:Multipurpose Internet Mail Extension 多用途網際網路郵件擴充套件,從而使得一個文字協議能夠傳輸一個非文字資料了
  • method:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

http/1.1:增加了快取功能

  • spdy:谷歌公司研發的改進版

http/2.0:借鑑了spdy

3)MIME

MIME:Multipurpose Internet Mail Extension 多用途網際網路郵件擴充套件,從而使得一個文字協議能夠傳輸一個非文字資料

MIME type幫助瀏覽器識別一個HTTP請求返回的是什麼內容的資料,應該如何開啟、如何顯示

MIME的常見形式是一個主型別加一個子型別,用斜線分隔,比如text/html、application/javascript、image/png等

MIME是郵件和HTTP協議中用來標註網路資料的資訊格式的,比如

,它就對應伺服器上的一個/xxxxxx/images/logo.jpg檔案。在有人訪問它時,返回的MIME type是image/jpeg

1.2 HTTP工作模式

1)http請求和響應

http請求報文:http request

http響應報文:http response

2)http事務

一次http事務:請求 <--> 響應

一個請求和一次響應共同構成一次http事務

3)web資源(web resource)

靜態資源:無需伺服器端做出額外處理

  • .jpg,.png,.gif,.html,.txt,.js,.css,.mp3,.avi

動態資源:服務端需要通過執行程式做出處理,傳送給客戶端的是執行的結果

  • .php,.jsp

4)資源標識機制URL

1.3 URI和URL

1)URI

URI,統一資源標誌符(Uniform Resource Identifier, URI)表示的是web上每一種可用的資源,如HTML文件、影象、視訊片段、程式等都由一個URI進行標識。

URI的組成:通常由三部分組成(這只是一般URI資源的命名方式,只要是可以唯一標識資源的都被稱為URI,下面三條合在一起是URI的充分不必要條件)

  • 資源的命名機制
  • 存放資源的主機名
  • 資源自身的名稱

例如:https://www.cnblogs.com/hgzero/p/13409248.html ,可以這樣解釋它:

# 1.這是一個可以通過https協議訪問的資源
# 2.位於主機www.cnblogs.com上
# 3.通過 /hgzero/p/13409248.html 可以對該資源進行唯一標識(這個不一定是完整的路徑)

# 注意:上面三點並不是URI的必要條件,URI只是一種概念,只要它唯一標識一個資源就可以。

2)URL

URL(Uniform Resource Locator),統一資源定位符,URL是URI的一個子集。

URL是Internet上描述資訊資源的字串,採用URL可以用一種統一的格式來描述各種資訊資源,包括檔案、伺服器的地址和目錄等,URL是URI概念的一種實現方式。

URL的格式:

Scheme://hostname[:port] / path / [;parameters][?query]#fragment

# URL的格式由三部分組成: 
    # 1. 第一部分:協議(或稱為服務方式),URL方案
    # 2. 第二部分:存有該資源的主機IP地址(有時也包括埠號),伺服器地址 IP:PORT
    # 3. 第三部分:主機資源的具體地址,如目錄和檔名等

# 第一部分和第二部分用“://”符號隔開,
# 第二部分和第三部分用“/”符號隔開。
# 第一部分和第二部分是不可缺少的,第三部分有時可以省略

# params:引數
    http://www.hgzero.com/bbs/hello;gender=f
# query:查詢條件
    http://www.hgzero.com/bbs/item.php?username=tom&title=abc
# frag:標識
    https://www.hgzero.com/index.html#ch-Boot-x86

3)URI和URL的區別

URI和URL都定義了資源是什麼,但URL還定義了該如何訪問資源。

URL是一種具體的URI,它是URI的一個子集,它不僅唯一標識資源,而且還提供了定位該資源的資訊。

URI 是一種語義上的抽象概念,可以是絕對的,也可以是相對的,而URL則必須提供足夠的資訊來定位,是絕對的。

1.4 一次完整的http請求處理過程

  1. 建立或處理連線:接收請求或拒絕請求
  2. 接受請求:接受來自於網路上的主機請求報文中對某特定資源的一次請求的過程
  3. 處理請求:對請求報文進行解析,獲取客戶端請求的資源及請求方法等相關資訊
  4. 訪問資源:獲取請求報文中請求的資源
  5. 構建響應報文
  6. 傳送響應報文
  7. 記錄日誌

1.5 併發訪問模型

單程序IO模型:啟動一個程序處理使用者請求,這意味著,一次只能處理一個請求,多個請求被序列響應

多程序IO結構:並行啟動多個程序,每個程序響應一個請求

複用的IO結構:一個程序響應n個請求

  • 多執行緒模式:一個程序生成n個執行緒,一個執行緒處理一個請求
  • 事件驅動(event-driven):一個程序直接處理n個請求

複用的多程序IO結構:啟動多個(m)個程序,每個程序生成(n)個執行緒

  • 響應的請求數量:m*n

1.6 處理請求

分析請求報文的http請求報文首部

# http協議
    http請求報文首部
    http響應報文首部

# 請求報文首部的格式:
    <method> <URL> <VERSION>
    HEADERS:(name:value)
    <request body>

1.7 訪問資源

存放了web資源的主機負責向請求者提供靜態資源或動態資源執行生成的結果,這些資源通常應該放置於本地檔案系統某路徑下,此路徑稱為DocRoot

# 比如/var/www/html/  為文件根路徑,下面有檔案 image/logo.jpg

# 這個資源的URL:http://www.hgzerowzh.com/images/logo.jpg

web伺服器的資源路徑對映方式

# docroot
# alias
# 虛擬主機的docroot
# 使用者家目錄的docroot

1.8 http請求處理的連線模式

  • 保持連線(長連線):keep-alive
    • 時間
    • 數量
  • 非保持連線(短連線)

2. HTTP報文

2.1 http報文語法格式

# request報文格式
<method> <request-URL> <version><handers>
<entity-body>

# response報文格式
<version> <status> <reason-phrase><headers><entity-body>

# request報文示例:
    GET /  HTTP/1.1 
    Host: www.hgzerowzh.com
    Connection: keep-alive 
    Cache-Control: max-age=0 
    
# response報文示例:
    HTTP/1.1 200 OK 
    Date: Tue, 08 Oc
    t 2019 04:50:21 GMT 
    Content-Type: text/html 
    Transfer-Encoding: chunked 
    Connection: keep-alive 

2.2 method請求方法

請求方法:表明客戶端希望伺服器對資源執行的動作

2.3 version版本號

HTTP/<major>.<minor>
# 協議名/主版本號.次版本號
# 例如:HTTP/1.1、HTTP/1.0

2.4 status狀態碼

1)狀態碼型別

# 三位數字,如 200,301,302,404,502,標記請求處理過程中發生的情況
1xx:100-101, 資訊提示
2xx:200-206, 成功
3xx:300-305, 重定向
4xx:400-415, 錯誤類資訊,客戶端錯誤
5xx:500-505, 錯誤類資訊,伺服器端錯誤

2)常用的狀態碼

# 常用的狀態碼:
200: 成功,請求的所有資料通過響應報文的entity-body部分發送;OK
301: 請求的URL指向的資源已經被刪除,但在響應報文中通過首部Location指明瞭資源現在所處的新位置;Moved Permanently (永久重定向)
302: 與301相似,但在響應報文中通過Location指明資源現在所處臨時新位置;Found (臨時重定向)
304: 客戶端發出了條件式請求,但伺服器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端;Not Modified

400: 訪問的頁面域名不存在或者請求錯誤;bad request invalid hostname
401: 需要輸入賬號和密碼認證方能訪問資源;Unauthorized 403: 請求被禁止;Forbidden 404: 伺服器無法找到客戶端請求的資源;Not Found
500: 伺服器內部錯誤;Internal Server Error 502: 代理伺服器從後端伺服器收到了一條偽響應;Bad Gateway

2.5 reason-phrase原因短語

狀態碼所標記的狀態的簡要描述,如:

# 各個狀態碼所對應的原因短語
200 OK
301 Moved Permanently
302 Found
304 Not Modified
403 Forbidden
404 Not Found

2.6 headers

每個請求或響應報文都可以包含任意個首部

每個首部都有首部名稱,後面跟一個冒號,然後跟上一個可選空格,接受的是一個值

header的格式(Name: Value)

Cache-Control:public, max-age=600
Connection:keep-alive
Content-Type:image/png
Date:Tue, 28 Apr 2015 01:43:54 GMT
ETag:"5af34e-ce6-504ea605b2e40"
Last-Modified:Wed, 08 Oct 2014 14:46:09 GMT

Accept:image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:access.redhat.com
If-Modified-Since:Wed, 08 Oct 2014 14:46:09 GMT
If-None-Match:"5af34e-ce6-504ea605b2e40"
Referer:https://access.redhat.com
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) 

2.7 首部的分類

  • 通用首部、請求首部、響應首部、實體首部、擴充套件首部

1)通用首部

Date:         報文的建立時間
Connection:   連線時間,如keep-alive,close
Via:          顯示報文經過的中間節點
Cache-Control:控制快取
Pragma:

2)請求首部

Accept:通知伺服器主機可接受的媒體型別(MIME,text/html,application/javascript,image/jpeg)
Accept-Charset: 預設字符集
Accept-Encoding:接受編碼格式,如gzip,一般指壓縮機制
Accept-Language:接受的語言

Client-IP:
Host:       請求的伺服器名稱和埠號
Referer:    包含當前正在請求的資源的上一級資源
User-Agent: 客戶端代理

# 條件式請求首部
Expect:
If-Modified-Since: 主從指定的時間之後,請求的資源是否發生過修改
If-Unmodified-Since:
If-None-Match:     本地快取中儲存的文件的ETag標籤是否與伺服器文件的ETag不匹配
If-Match

# 安全請求首部
Authorization: 向伺服器傳送認證資訊,如住賬號和密碼
Cookie:        客戶端向伺服器傳送cookie
Cookie2:

# 代理請求首部
Proxy-Authorization:向代理伺服器認證

3)響應首部

# 資訊性:
Age:響應持續時長
Server:伺服器程式軟體名稱和版本

# 協商首部:某資源有多種表示方法時使用
Accept-Ranges:伺服器可接受的請求範圍型別
Vary:伺服器檢視的其他首部列表

# 安全響應首部:
Set-Cookie:向客戶端設定cookie
Set-Cookie2:
WWW-Authenticate:來自伺服器的對客戶端的質詢認證表單

4)實體首部

Allow:列出對此實體可使用的請求方法
Location:告訴客戶端真正的實體位於何處

Content-Encoding:
Content-Language:
Content-Length: 主體的長度
Content-Location: 實體真正所處位置;
Content-Type:主體的物件型別

# 快取相關:
ETag:實體的擴充套件標籤;
Expires:實體的過期時間;
Last-Modified:最後一次修改的時間

3. Curl命令的使用

3.1 curl命令說明

curl命令是基於URL語法在命令列方式下工作的檔案傳輸工具,它支援FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等協議,支援檔案斷點續傳。

3.2 curl使用語法及引數

# 使用語法
curl [options] [URL...]
#curl的常用選項: -A/--user-agent <string> 設定使用者代理髮送給伺服器 示例:curl -A "hgzero-chrome" 192.168.1.111 -I/--head 只顯示響應報文首部資訊 -e/--referer <URL> 來源網址 --compressed 要求返回的是壓縮的格式 -X 選項可以自定義url的請求方法 curl -X PURGE http://172.16.0.6/index.html

3.3 elinks

# 使用語法
elinks  [OPTION] ... [URL] ...

# 使用引數
--dump:不進入互動式模式,而直接將URL的內容輸出至標準輸出