在開發應用程式的時候常會需要連到網際網路上取得一些資料或是傳送一些資料出去,而這當中最常使用的協定就是HTTP/HTTPS了!在Rust程式語言中,若要使用HTTP、HTTPS協定來進行連線,在crates.io上雖然已經有很多現成的HTTP客戶端套件可以使用,但用起來大多很複雜,有的還會需要連結許多動態函式庫,導致程式不容易被部署。



Easy HTTP Request

「Easy HTTP Request」是筆者開發的套件,利用「hyper」這個Rust生態圈最常用的HTTP函式庫來完成的簡易HTTP客戶端。提供GET、POST、PUT、DELETE、HEAD這五種常用的HTTP請求方法,無需處理「future」相關的程式(所以會在同一個執行緒下運作),可以限制URL資源的回應大小、轉址次數、連線時間上限,也可以設定是否要允許連到內部網路(包含本地端和區域網路)的網址。

Crates.io

https://crates.io/crates/easy-http-request

Cargo.toml

easy-http-request = "*"

使用方法

「easy_http_request」這個crate提供的「HttpRequest」結構體,可以設定HTTP請求的標頭(headers)、查詢(query)和主體(body),資料類型使用泛型。如果想要方便一點,讓它們的資料類型都是靜態的字串切片的話,可以使用「StaticHttpRequest」這個型別來產生「HttpRequest」的結構實體。如果想要讓它們的資料類型都是String結構體的話,可以使用「DefaultHttpRequest」這個型別來產生「HttpRequest」的結構實體。

「HttpRequest」結構體提供了「get」、「post」、「put」、「delete」和「head」這五種關聯函數來快速產生「HttpRequest」的結構實體,且這五種關聯函數都另外有以「_from_url_str」結尾的函數(如get_from_url_str)。

最基本的使用範例如下:

extern crate easy_http_request;

use easy_http_request::DefaultHttpRequest;

fn main() {
    let response = DefaultHttpRequest::get_from_url_str("https://tool.magiclen.org/ip").unwrap().send().unwrap();

    println!("{}", String::from_utf8(response.body).unwrap());
}

以上程式可以印出目前電腦的對外IP。

「HttpRequest」的結構實體在使用「send」方法之後,擁有權就會被拿走,而不能再被使用了。如果要重複使用同一個「HttpRequest」的結構實體來發送請求的話,就要使用「send_preserved」方法。

另外,預設能接收的HTTP回應大小上限為1 MiB,如果想要更改,可以去設定「HttpRequest」結構實體的「max_response_body_size」欄位;預設能轉跳的次數為5次,如果想要更改,可以去設定「HttpRequest」結構實體的「max_redirect_count」欄位;預設並不會限制連線時間,如果想要更改,可以去設定「HttpRequest」結構實體的「max_connection_time」欄位,時間單位是毫秒;預設會允許存取內部的網址,如果想要更改,可以去設定「HttpRequest」結構實體的「allow_localhost」欄位。