当前位置: 首页 > 知识库问答 >
问题:

rust axum 接口传参问题?

微生翼
2024-04-04
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里的一些数据,做验证,以及使用用户传过来的参数做有业务,那么如何可以同时获取这些数据呢?求教大佬,找了好多资料都找不到,也可能是我能力还比较差,看不懂文档,请各位大佬帮助

共有1个答案

邹普松
2024-04-04

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> 一块用。

 类似资料:
  • 如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcpy(char *dest, const char *src); 其中src参数是传入参数,dest参数是传出参数。有些函数的指针参数同时担当了这两种角色,如select函数。其函数原型为: int

  • 接口传参的时候需要给后端传的参数是数组 大概是这样的: 在这弹窗里面,点击弹窗下面的保存按钮调接口,需要把每一行的单位代码和总人口作为参数传过去,还要判断一下id,这条数据有id的话就传id,没有id的话就不传id 只传单位代码和总人口 请问接口传参应该怎么传多维数组,把每一行的单位代码和总人口传给后端,还有判断id应该怎么去操作呢?

  • 传输接口 在客户端,传输层被设计为一个 Transport 接口,它只有两个方法:transport 和 abort。该接口在不语言中虽然定义有所不同,但在形式和参数上大致是一致的。 例如在 C# 中,该接口定义为: public interface ITransport { Task<Stream> Transport(Stream request, Context context);

  • 问题内容: 我有一个界面: 和一个实现它的类 第三类实现了此方法: 现在我试图像这样调用该方法 但我不断得到一个例外说: 如果它连接了该类,该方法不起作用吗? 问题答案: 也许你需要

  • 问题内容: 我正在使用的软件包gosqlite的方法带有 可变 参数,其类型为 空接口 。 如果显式传递各个参数,我可以称呼它为好: 但是,由于可变参数与我的SQL语句的运算符内的占位符相对应,因此这些占位符的数目在编译时未知,但会在运行时根据用户的操作动态变化。例如,如果用户输入四个值,我最终会得到类似于以下的SQL: 所以自然地我想用一片字符串来调用该方法: 这不会编译。我可以通过创建一个空的

  • 问题内容: 短 以下代码不能完全满足您的期望:https : //play.golang.org/p/sO4w4I_Lle 我以为我像往常一样弄乱了一些指针/引用的东西,但是我希望我的… …和… …以相同的方式运行(例如,更新作为第二个参数传递的引用)。 长 上面的示例是一个没有太多意义的最小复制器。这是为了使其能够在操场上工作。但是,一个不那么有意义的最小示例是: 想法是将YAML解组为(而不是