Rust每週一庫 hyper 底層http庫

2021-10-01 21:49:10 字數 2401 閱讀 1351

現在說到寫應用,網路框架肯定是必不可少的。今天就給大家簡單介紹一下hyper。hyper是乙個偏底層的http庫,支援http/1和http/2,支援非同步rust,並且同時提供了服務端和客戶端的api支援。很多同學可能覺得既然hyper是個偏底層的框架,那是不是就不需要去了解了呢?首先很多上層的框架,比如rocket、iron和reqwest底層都是基於hyper的。(關於rust中各種網路開發框架,這裡有個很全面的綜述和比較。)所以如果在使用這些框架的時候遇到了一些問題,對hyper的了解肯定是有一定的幫助的。再者學習rust的我們都是奔著成為大佬的路線去的,很難說不會有直接操作偏底層框架的需求。

我們首先來實現乙個簡單的伺服器端和客戶端,支援最簡單的get操作。

首先是依賴,除了hyper本身之外,我們還需要tokio的runtime去執行async函式

[dependencies]

hyper = "0.13"

tokio =

然後就是main.rs

use std::;

use hyper::;

use hyper::service::;

// 返回200

async fn handle(_: request) -> result, infallible>

#[tokio::main]

async fn main() );

let server = server::bind(&addr).serve(make_svc);

// 執行server

if let err(e) = server.await ", e);

}}

依賴同伺服器端

// 將response(是個stream)輸出到stdout

while let some(chunk) = resp.body_mut().data().await

ok(())

}先啟動服務端,然後啟動客戶端,就可以看到服務端成功相應客戶端的get請求啦~

response: 200 ok

hello, world!

下面我們通過實現乙個echo服務主要看一下伺服器端如何進行路由,以及如何支援post請求

依賴

[dependencies]

hyper = "0.13"

tokio =

futures-util =

**

use futures_util::trystreamext;

use hyper::service::;

use hyper::;

async fn echo(req: request) -> result, hyper::error> ,

(&method::post, "/echo") => ,

(&method::post, "/echo/uppercase") => );

// 把stream變成body

},(&method::post, "/echo/reverse") => ,

_ => ,

};ok(response)

}#[tokio::main]

async fn main() );

let server = server::bind(&addr).serve(make_svc);

if let err(e) = server.await ", e);

}}

依賴和之前客戶端一樣。我們這裡的**以向/echo/reverse提交內容為echo的post請求為例:

use hyper::client;

use hyper::;

#[tokio::main]

async fn main() -> result<(), box> ", resp.status());

println!("", hyper::body::to_bytes(resp.into_body()).await.unwrap());

ok(())

}

依次啟動服務端和客戶端,就可以看到服務端響應了客戶端的post請求啦~

response: 200 ok

b"ohce"

好了,對hyper的介紹就到這裡了。接下來就靠大家自己去深似海的網路程式設計世界中去摸索啦~

Rust每週一庫 csv 檔案讀寫庫

這次搬運的庫是很多資料分析師 資料科學家 以及金融分析師常用的csv檔案庫。用rust實現的乙個高效能 靈活的csv讀寫器,支援serde.將以下配置加進你的cargo.toml dependencies csv 1.1 簡單示範如何從stdin讀取csv資料並通過stdout將每一條記錄列印出來。...

Rust每週一庫 failure 錯誤處理庫

錯誤處理在生產級別的 中一直都是乙個重點。在原型階段,愉快地使用unwrap可以確保思路和精力被集中用在業務邏輯開發上。不過對於最終要上線的 優雅的處理錯誤卻是至關重要的。原生rust錯誤處理的工具有std error error 一般我們會看到box的形式 操作符以及enum供我們自定義錯誤型別。...

Rust每週一知 一種 Rust 設計模式

最近發現一種 rust 的設計模式,有點好玩,發出來大家 一下。示例如下 use std ops deref trait traitfoo struct a impl traitfoo for a struct b implb implderef for b trait traitbar struc...