HTTP یک روش فوق العاده محبوب برای برقراری ارتباط با سرورهای راه دور است. از این کتابخانه عالی Rust برای کمک به ساده کردن فرآیند استفاده کنید.
مانند بسیاری از زبان های برنامه نویسی، می توانید از Rust برای ارسال و دریافت داده ها از طریق HTTP استفاده کنید. هنگامی که در حال ساخت یک سرویس مبتنی بر وب هستید، اغلب باید یک یا چند سرویس را ادغام کنید. شما اغلب این کار را با ارسال درخواست های HTTP برای آنها انجام می دهید.
Rust دارای عملکرد داخلی برای عملیات HTTP است. همچنین کتابخانه های زیادی در اکوسیستم Rust وجود دارد که به شما در تعامل با HTTP و ایجاد سرویس های HTTP کمک می کند.
ایجاد درخواست HTTP با Rust
چندین کتابخانه Rust برای درخواست HTTP در دسترس هستند، از جمله کتابخانه های Reqwest، Hyper و Surf. Reqwest در بین توسعه دهندگان Rust محبوب ترین است.
Reqwest یک کتابخانه سرویس گیرنده سطح بالا است که یک API ساده و راحت برای درخواست HTTP ارائه می دهد. Reqwest عملکردی را برای ارسال درخواست ها و رسیدگی به پاسخ ها و خطاها فراهم می کند. بسیاری از جزئیات پشت درخواست HTTP را خلاصه می کند و از ویژگی های پیشرفته مانند درخواست های ناهمزمان با استفاده از زمان اجرا توکیو پشتیبانی می کند. همچنین از سریالزدایی JSON، هدرهای HTTP، زمانبندی اتصال و تنظیمات SSL نیز استفاده میکند.
اگر با Rust تازه کار هستید یا تجربه کافی در مورد خدمات HTTP ندارید، کتابخانه Reqwest را مفید خواهید یافت.
برای شروع با Reqwest، کتابخانه های Reqwest و Tokio را به وابستگی های پروژه خود اضافه کنید. توکیو یک کتابخانه زمان اجرا ناهمزمان است که با Reqwest تعامل دارد. پس از ایجاد پروژه Rust می توانید این وابستگی ها را به فایل Cargo.toml خود اضافه کنید.
[dependencies]
tokio = { version = "1.15", features = ["full"] }
reqwest = { version = "0.11", features = ["json"] }
هنگامی که کتابخانه های Reqwest و Tokio را به وابستگی های پروژه خود اضافه کردید، Cargo آنها را هنگام ساخت برنامه خود نصب می کند.
HTTP دریافت درخواست با Reqwest
برای بازیابی دادهها از یک وب سرور درخواستهای GET میکنید. درخواستهای GET میتوانند صفحات HTML، دادههای JSON یا فایلهای باینری مانند تصاویر یا ویدیوها را بازیابی کنند.
Reqwest به شما امکان می دهد نقطه پایانی URL را به عنوان یک رشته به همراه پارامترهای پرس و جو و هدرهای درخواست مشخص کنید.
در اینجا نحوه ارسال درخواست HTTP GET به URL آمده است:
use reqwest::Error;
async fn get_request() -> Result<(), Error> {
let response = reqwest::get("https://www.example.com").await?;
println!("Status: {}", response.status());
let body = response.text().await?;
println!("Body:\n{}", body);
Ok(())
}
#[tokio::main]
async fn main() -> Result<(), Error> {
get_request().await?;
Ok(())
}
این کد یک تابع ناهمزمان به نام get_request را برای چاپ جزئیات پاسخ از یک درخواست به example.com تعریف می کند. روش دریافت ماژول reqwest را فراخوانی می کند و کد وضعیت و بدنه پاسخ را چاپ می کند.
در اینجا نتیجه فراخوانی تابع get_request از تابع اصلی است:
مدیریت خطاهای HTTP با Reqwest
شما باید هنگام بروز خطاها از درخواست های HTTP رسیدگی کنید. کتابخانه Reqwest یک نوع خطا را ارائه می دهد که می توانید از آن برای رسیدگی به خطاها استفاده کنید. علاوه بر این، کدهای وضعیت HTTP از وب سرور می توانند اطلاعاتی در مورد وضعیت درخواست ارائه دهند.
در اینجا نحوه رسیدگی به خطاهای HTTP برای درخواست های خود با Reqwest آمده است:
use reqwest::Error;
async fn handle_error() -> Result<(), Error> {
let response = reqwest::get("https://www.example.com").await?;
match response.status().as_u16() {
200..=299 => {
let body = response.text().await?;
println!("Success! Body:\n{}", body);
}
400..=599 => {
let status = response.status();
let error_message = response.text().await?;
println!("Error {}: {}", status, error_message);
}
_ => {
println!("Unexpected status code: {}", response.status());
}
}
Ok(())
}
#[tokio::main]
async fn main() -> Result<(), Error> {
handle_error().await?;
Ok(())
}
تابع handle_error یک درخواست GET به example.com میکند و عبارت match هرگونه خطا را بر اساس کد وضعیت پاسخ کنترل میکند.
تابع بسته به پاسخ به سرور یک پیام و کد وضعیت را چاپ می کند.
ارسال درخواست HTTP POST با Reqwest
برای ارسال داده ها به سرور، درخواست های HTTP POST ارائه می کنید. می توانید این کار را با استفاده از ساختار reqwest::Client که یک کلاینت ایجاد می کند انجام دهید و از ساختار reqwest::RequestBuilder برای ساخت درخواست استفاده کنید.
در اینجا نحوه ایجاد یک درخواست POST به نقطه پایانی درخواست POST HTTPbin با Reqwest آورده شده است:
use reqwest::{Client, Error};
async fn post_it() -> Result<(), Error> {
let url = "https://httpbin.org/post";
let json_data = r#"{"name": "John Doe", "email": "john.doe@example.com"}"#;
let client = reqwest::Client::new();
let response = client
.post(url)
.header("Content-Type", "application/json")
.body(json_data.to_owned())
.send()
.await?;
println!("Status: {}", response.status());
let response_body = response.text().await?;
println!("Response body:\n{}", response_body);
Ok(())
}
#[tokio::main]
async fn main() -> Result<(), Error> {
post_it().await?;
Ok(())
}
متغیر json_data داده های JSON را برای درخواست تعریف می کند و متغیر مشتری یک نمونه reqwest::Client برای درخواست POST است.
متغیر پاسخ سازنده درخواست POST است. متد ارسال درخواست POST را به URL ارسال می کند و روش هدر یک هدر HTTP را تنظیم می کند. متد body بدنه درخواست را تنظیم می کند و روش ارسال درخواست را ارسال می کند.
تابع post_it کد وضعیت پاسخ و بدنه را با استفاده از println در کنسول چاپ می کند! ماکرو:
مدیریت هدرها و پارامترهای پرس و جو درخواست های HTTP شما
مدیریت هدرها و پارامترهای پرس و جو یکی از جنبه های مهم ایجاد درخواست های HTTP است. سرصفحه ها حاوی اطلاعات اضافی مانند اعتبارنامه های احراز هویت یا ابرداده در مورد محتوای درخواستی هستند.
شما از پارامترهای پرس و جو برای افزودن اطلاعات اضافی به URL برای سرور برای فیلتر کردن یا اصلاح پاسخ استفاده خواهید کرد.
رسیدگی به هدرها و پارامترهای پرس و جو فرآیندی مشابه ارسال درخواست های پست را دنبال می کند. در اینجا نحوه مدیریت هدرها و پارامترهای پرس و جو در درخواست های HTTP با Reqwest آمده است:
use std::collections::HashMap;
use reqwest::{ Error, header};
#[tokio::main]
async fn main() -> Result<(), Error> {
headers_for_requests().await?;
Ok(())
}
async fn headers_for_requests() -> Result<(), Error> {
// Set up the URL and headers for the request
let url = "https://example.com/api";
let mut headers = header::HeaderMap::new();
headers.insert(header::USER_AGENT, header::HeaderValue::from_static("reqwest"));
headers.insert(header::CONTENT_TYPE, header::HeaderValue::from_static("application/json"));
// Set up the query parameters for the request
let mut params = HashMap::new();
params.insert("foo", "bar");
params.insert("baz", "qux");
// Make the request
let response = reqwest::Client::new()
.get(url)
.headers(headers)
.query(¶ms)
.send()
.await?;
// Handle the response
println!("{:#?}", response);
Ok(())
}
شما یک نقشه برای پارامترهای پرس و جو ایجاد می کنید که سپس به روش پرس و جو ارسال می کنید. برای افزودن هدر یک نمونه از نوع header::HeaderMap ایجاد کنید.
تابع headers_for_requests یک درخواست GET را با چندین هدر و پارامترهای پرس و جو به example.com ارسال می کند. از هدرها و روش های پرس و جو استفاده می کند که به ترتیب نقشه هایی حاوی سرصفحه ها و پارامترهای پرس و جو را می گیرند.
شما می توانید برنامه وب Full Stack را در Rust با WASM بسازید
ایجاد درخواستهای HTTP مهارتی است که برای ساخت برنامههای پیچیده که عملکردهای دیگر برنامهها را ادغام میکنند، مفید است.
میتوانید برنامههای وب تمام پشته را در Rust با کتابخانههایی مانند Percy، Yew و Sycamore بسازید که پیچیدگیهای انتزاعی برای تجربه توسعه عالی دارند.