前言 一般情境下,可以使用 reqwest
套件來發送 HTTP 請求,它是基於提供低階 API 的 hyper
套件的封裝。
做法 使用 reqwest 套件 安裝依賴套件。
1 2 3 4 [dependencies] reqwest = { version = "0.11" , features = ["json" ] }serde = { version = "1.0" , features = ["derive" ] }tokio = { version = "1" , features = ["full" ] }
GET 修改 main.rs
檔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 use serde::{Deserialize, Serialize};use std::error::Error;#[derive(Serialize, Deserialize, Debug)] struct Response { origin: String , } #[tokio::main] async fn main () -> Result <(), Box <dyn Error>> { let resp = fetch ().await ?; println! ("{:#?}" , resp); Ok (()) } async fn fetch () -> Result <Response, Box <dyn Error>> { let client = reqwest::Client::new (); let res = client .get ("https://httpbin.org/ip" ) .send () .await ? .json::<Response>() .await ?; return Ok (res); }
執行程式。
輸出如下:
1 2 3 Response { origin: "101.10.97.155" , }
POST 修改 main.rs
檔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 use serde::{Deserialize, Serialize};use std::{collections::HashMap, error::Error};#[derive(Serialize, Deserialize, Debug)] struct Response { json: HashMap<String , String >, } #[tokio::main] async fn main () -> Result <(), Box <dyn Error>> { let resp = fetch ().await ?; println! ("{:#?}" , resp); Ok (()) } async fn fetch () -> Result <Response, Box <dyn Error>> { let mut map = HashMap::new (); map.insert ("lang" , "rust" ); map.insert ("body" , "json" ); let client = reqwest::Client::new (); let res = client .post ("https://httpbin.org/anything" ) .json (&map) .send () .await ? .json::<Response>() .await ?; return Ok (res); }
執行程式。
輸出如下:
1 2 3 4 5 6 Response { json: { "lang" : "rust" , "body" : "json" , }, }
使用 hyper 套件 安裝依賴套件。
1 2 3 [dependencies] hyper = { version = "0.14" , features = ["full" ] }tokio = { version = "1" , features = ["full" ] }
修改 main.rs
檔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 use hyper::{Client, Uri};use std::str ;type Result <T> = std::result::Result <T, Box <dyn std::error::Error + Send + Sync >>;#[tokio::main] async fn main () -> Result <()> { let client = Client::new (); let uri = Uri::from_static ("http://httpbin.org/ip" ); let mut res = client.get (uri).await ?; println! ("status code: {}" , res.status ()); for (key, value) in res.headers ().iter () { println! ("{}: {}" , key, value.to_str ().unwrap ()) } let body = res.body_mut (); let buf = hyper::body::to_bytes (body).await ?; let content = str ::from_utf8 (buf.as_ref ())?; println! ("{}" , content); Ok (()) }
執行程式。
輸出如下:
1 2 3 4 5 6 7 8 9 10 11 status code: 200 OK date : Mon, 05 Dec 2022 15:09:59 GMTcontent-type: application/json content-length: 32 connection: keep-alive server: gunicorn/19.9.0 access-control-allow-origin: * access-control-allow-credentials: true { "origin" : "101.10.97.155" }
參考資料