現在說到寫應用,網路框架肯定是必不可少的。今天就給大家簡單介紹一下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...