面试题答案
一键面试- 添加依赖:
在
Cargo.toml
文件中添加reqwest
依赖:[dependencies] reqwest = "0.11" serde = { version = "1.0", features = ["derive"] } serde - json = "1.0"
- 解析查询参数和表单数据:
以下是主要的代码示例:
use reqwest::blocking::Client; use serde::Deserialize; #[derive(Deserialize)] struct QueryParams { param1: String, // 可以根据实际需求添加更多字段 } #[derive(Deserialize)] struct FormData { data1: String, // 可以根据实际需求添加更多字段 } fn main() { let client = Client::new(); let query_params = QueryParams { param1: "value1".to_string(), }; let form_data = FormData { data1: "form_value1".to_string(), }; let response = client .post("http://example.com/api") .query(&query_params) .form(&form_data) .send() .unwrap(); if response.status().is_success() { let body = response.text().unwrap(); println!("Response body: {}", body); } else { println!("Request failed with status: {}", response.status()); } }
- 解析步骤:
- 定义结构体:
- 使用
serde
库的Deserialize
特性定义两个结构体,一个用于解析查询参数(如QueryParams
),另一个用于解析表单数据(如FormData
)。结构体的字段名应与请求参数的名称对应。
- 使用
- 构建请求:
- 创建一个
reqwest
的blocking::Client
实例。 - 使用
post
方法指定请求的URL。 - 使用
.query
方法添加查询参数,参数为QueryParams
结构体实例。 - 使用
.form
方法添加表单数据,参数为FormData
结构体实例。
- 创建一个
- 发送请求并处理响应:
- 使用
.send
方法发送请求,并通过.unwrap()
处理可能的错误。 - 检查响应状态,如果状态码表示成功(
.is_success()
),则获取响应体(.text()
)并进行处理,否则打印错误状态码。
- 使用
- 定义结构体:
在实际的服务器端代码中,处理接收到的POST请求时,解析过程会有所不同,例如使用actix - web
等Web框架来解析请求数据,但基本的serde
解析结构体定义的思路类似。例如在actix - web
中可能如下:
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};
use serde::Deserialize;
#[derive(Deserialize)]
struct QueryParams {
param1: String,
}
#[derive(Deserialize)]
struct FormData {
data1: String,
}
#[post("/api")]
async fn handle_post(
query: web::Query<QueryParams>,
form: web::Form<FormData>,
) -> impl Responder {
println!("Query param1: {}", query.param1);
println!("Form data1: {}", form.data1);
HttpResponse::Ok().body("Request processed")
}
这里actix - web
框架通过web::Query
和web::Form
自动将请求中的查询参数和表单数据解析到对应的结构体实例中。