RustWeb开发:数据提取与前端展示
立即解锁
发布时间: 2025-09-05 00:44:05 阅读量: 3 订阅数: 18 AIGC 

### Rust Web开发:数据提取与前端展示
#### 1. 从请求体中提取JSON数据
在处理请求时,我们常常需要从请求体中提取JSON数据。以下是相关的操作步骤和代码示例:
1. **定义视图轮廓**
```rust
pub async fn edit(to_do_item: web::Json<ToDoItem>)
-> HttpResponse {
...
}
```
在上述代码中,`ToDoItem` 结构体被包装在 `web::Json` 结构体中,这意味着 `to_do_item` 参数将从请求体中提取、序列化并构造为 `ToDoItem` 结构体。
2. **加载应用状态**
```rust
let state: Map<String, Value> = read_file("./state.json");
```
3. **提取项目数据**
```rust
let status: TaskStatus;
match &state.get(&to_do_item.title) {
Some(result) => {
status = TaskStatus::new(result.as_str().unwrap());
}
None => {
return HttpResponse::NotFound().json(
format!("{} not in state", &to_do_item.title))
}
}
```
4. **构造项目结构体**
```rust
let existing_item = to_do_factory(to_do_item.title.as_str(),
status.clone());
```
5. **比较新旧状态**
```rust
if &status.stringify() == &TaskStatus::from_string(
&to_do_item.status.as_str()
.to_string()).stringify() {
return HttpResponse::Ok().json(ToDoItems::get_state())
}
```
6. **处理输入并返回状态**
```rust
process_input(existing_item, "edit".to_owned(), &state);
return HttpResponse::Ok().json(ToDoItems::get_state())
```
为了使上述代码正常工作,我们需要让 `TaskStatus` 枚举实现 `Clone` 特性:
```rust
#[derive(Clone)]
pub enum TaskStatus {
DONE,
PENDING
}
```
同时,要确保编辑视图在待办事项视图工厂中可用并定义:
```rust
mod create;
mod get;
mod edit;
use actix_web::web::{ServiceConfig, post, get, scope};
pub fn to_do_views_factory(app: &mut ServiceConfig) {
app.service(
scope("v1/item")
.route("create/{title}", post().to(create::create))
.route("get", get().to(get::get))
.route("edit", post().to(edit::edit))
);
}
```
#### 2. 从请求头中提取数据
当需要对一系列请求进行授权时,将安全凭证放在所有JSON结构体中并不可扩展,而且请求体可能很大,尤其是在请求者恶意操作的情况下。因此,在将请求传递到视图之前访问安全凭证是有意义的,这可以通过中间件来实现。
1. **添加依赖**
在 `Cargo.toml` 文件中添加 `actix-service` 依赖:
```toml
[dependencies]
actix-web = "4.0.1"
serde_json = "1.0.59"
serde = { version = "1.0.136", features = ["derive"] }
actix-service = "2.0.2"
```
2. **更新 `src/main.rs` 文件**
```rust
use actix_web::{App, HttpServer};
use actix_service::Service;
mod views;
mod to_do;
mod state;
mod processes;
mod json_serialization;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
let app = App::new()
.wrap_fn(|req, srv|{
println!("{:?}", req);
let future = srv.call(req);
async {
let result = future.await?;
Ok(result)
}
}).configure(views::views_factory);
return app
```
0
0
复制全文
相关推荐









