配置
- idleTimeout:在httpClient請求結束後,會繼續保持連線,直到超過idleTimeout值才會關閉連接。
- connectionTimeout:和伺服器建立連線逾時,如果超過connectionTimeout值則會拋出SocketException異常。
- maxConnectionsPerHost:同一個host,允許同時建立連線的最大數量。
- autoUncompress:對應請求頭中的Content-Encoding,如果設定為true,則請求頭中Content-Encoding的值為目前HttpClient支援的壓縮演算法列表,目前只有"gzip"。
- userAgent:對應請求頭中的User-Agent欄位。
HTTP請求認證
Http的認證(Authentication)機制可以用來保護非公開資源。如果Http伺服器開啟了認證,那麼使用者在發起請求時就需要攜帶使用者憑證。
Http的認證機制有:Digest認證、Client認證、Form Based認證等。目前Flutter的HttpClient只支援Basic和Digest兩種。這兩種認證方式最大的差別是傳送使用者憑證時,使用者憑證的內容,前者是通過Base64編碼,而後者是通過哈希運算。Basic
httpClient.addCredentials(_uri,
"admin",
HttpClientBasicCredentials("username","password"),
);
Digest
httpClient.addCredentials(_uri,
"admin",
HttpClientDigestCredentials("username","password"),
);
證書校驗
- 如果請求的Https憑證是可信任CA核發的,且存取host包含在憑證的domain清單中(或符合通配規則)且憑證未過期,則驗證通過。
- 如果第一步驗證失敗,但在建立HttpClient時,已經透過SecurityContext將憑證新增至憑證信任鏈中,那麼當伺服器傳回的憑證在信任鏈中的話,則驗證通過。
- 如果1、2驗證都失敗了,如果用戶提供了badCertificateCallback回調,則會調用它,如果回調返回true,則允許繼續鏈接,如果返回false,則終止鏈接。
發送HTTP請求
HttpClient httpClient = HttpClient();//建立HttpClient
HttpClientRequest request = await httpClient.getUrl(uri);//開啟Http連接,設定請求頭
request.headers.add("user-agent", "test");//設定請求header
String payload="Hi";
request.add(utf8.encode(payload));
//request.addStream(_inputStream); //可以直接加入輸入流
HttpClientResponse response = await request.close();//等待連接伺服器
String responseBody = await response.transform(utf8.decoder).join();//讀取回應內容
httpClient.close();//請求結束
Http Method如httpClient.post()、httpClient.delete()等。 如果包含Query參數,可以在建置uri時添加,如:
Uri uri = Uri(scheme: "https", host: "xxx", queryParameters: {
"aa":"bb",
"cc":"dd"
});