rust axum 接口传参问题?

use axum::Json;
use axum::extract::Request;
use axum::http::header::HeaderMap;
use axum::http::StatusCode;
use serde::{Serialize, Deserialize};
use serde_json::{Value, json};

#[derive(Deserialize)]  
pub struct Info {
    name: String,
    age: u8,
}

pub async fn post_foo(info:Json<Info>, header: HeaderMap) -> Result<Json<Value>, StatusCode>  {

    let body = info;

    println!("name:{:?}, apge:{},  {header:?}", body.name, body.age);
    // 返回包含请求信息的 JSON 响应  
    Ok(Json(json!({"data": 42}))) 
}


.route("/foo", get(api::get_foo).post(api::post_foo))

各位好,我用rust的axum进行学习,现在有个问题,我提供的代码 第一个函数传了2个参数,一个是info,一个是header,问题是:第一个info加上后没问题,但函数如果加上第二个参数 下边一行.route中的api::post_foo就会报错,如果我把两个参数任意一个参数去掉,都不会报错。所以我就不知道该怎么办了,我其实是想拿到post的json数据,以及查看header,甚至想看request的一些数据。现在不知道怎么解决,还清各位大佬指点迷津,谢谢

补充: 我打该明白 因为两个参数类型一样,所以不让传,但有些时候,我需要获取request里的一些数据,做验证,以及使用用户传过来的参数做有业务,那么如何可以同时获取这些数据呢?求教大佬,找了好多资料都找不到,也可能是我能力还比较差,看不懂文档,请各位大佬帮助

阅读 968
1 个回答

handler function

For a function to be used as a handler it must implement the Handler trait. axum provides blanket implementations for functions that:

  • Are async fns.
  • Take no more than 16 arguments that all implement Send.

    • All except the last argument implement FromRequestParts.
    • The last argument implements FromRequest.
  • Returns something that implements IntoResponse.
  • If a closure is used it must implement Clone + Send and be 'static.
  • Returns a future that is Send. The most common way to accidentally make a future !Send is to hold a !Send type across an await.

最后一个参数必须实现了 FromRequest, 其它参数需要实现了 FromRequestParts.

翻一下文档就知道,HeaderMap 实现了 FromRequestParts ,而 Json<T> 实现了 FromRequestRequest<Body> 也是实现了 FromRequest,所以没法跟 Json<T> 一块用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进