首页 > 其他分享 >axum中的各种响应

axum中的各种响应

时间:2023-11-02 10:01:07浏览次数:37  
标签:各种 axum 响应 rs headers async fn

本章主要讨论 axum 的响应。axum 已经实现了多种响应,比如纯文本、HTML、JSON 及 自定义响应头(response header)。除了这些 axum 内置的响应之外,我们还将讨论如何将自己定义的结构体,作为响应返回给客户端。

axum 的响应

axum 有句话说的是:

Anything that implements IntoResponse can be returned from a handler

大意就是:凡是实现了 IntoResponse trait 的,都可作为 handler 的返回值,也就是我们所说的响应

官方已经对若干常用数据类型实现了该 trait,亦是说,这些数据类型可以直接作为请求的响应进行返回。

对于我们自己的数据类型,比如自定义的 struct,也只需要实现 IntoResponse,就可以直接作为响应进行返回了。

官方提供了示例,我们将结合这个示例对官方提供的响应进行说明。

由于新版的 axum 文档删除了这部分内容,我们提供早些版本的文档。

官方提供的响应

官方提供了以下响应:

类型数据类型
纯文本 &strString
字节序列 Vec<u8>
空响应 ()
仅有状态码 StatusCode
带响应头的响应 (HeaderMap, IntoResponse)
带响应头和状态的响应 (StatusCode, HeaderMap, IntoResponse)
HTML 响应 Html<IntoResponse>
JSON 响应 Json<IntoResponse>
Result响应 Result<T:IntoResponse, E:IntoResponse>

纯文本之 &str

async fn str_response() -> &'static str {
    "Hello, axum.rs"
}

纯文本之 String

async fn string_response() -> String{
    "Hello, axum.rs".to_string()
}

仅有状态码

async fn not_found()  -> StatusCode {
    StatusCode::NOT_FOUND
}

使用 curl 访问:

$ curl -I http://127.0.0.1:9527/404
HTTP/1.1 404 Not Found
content-length: 0
date: Mon, 15 Nov 2021 08:14:16 GMT

带响应头的响应

async fn with_headers() -> (HeaderMap, &'static str) {
    let mut headers = HeaderMap::new();
    headers.insert(
        HeaderName::from_static("x-powered");
        HeaderValue::from_static("axum.rs");
    );
    (headers, "axum.rs")
}

使用 curl 访问:

$ curl -I http://127.0.0.1:9527/with_headers
HTTP/1.1 200 OK
content-type: text/plain
x-powered: axum.rs
content-length: 0
date: Mon, 15 Nov 2021 08:18:00 GMT

带响应头和状态的响应

async fn with_headers_and_status() -> (StatusCode, HeaderMap, &'static str) {
    let mut headers = HeaderMap::new();
    headers.insert(
        HeaderName::from_static("x-powered");
        HeaderValue::from_static("axum.rs");
    );
    (StatusCode::OK, headers, "axum.rs")
}

使用 curl 访问:

$ curl -i http://127.0.0.1:9527/with_headers_and_status
HTTP/1.1 200 OK
content-type: text/plain
x-powered: axum.rs
content-length: 7
date: Mon, 15 Nov 2021 08:22:56 GMT

axum.rs

HTML 响应

async fn html() -> Html<&'static str> {
    Html("Hello, <em>axum.rs</em>")
}

JSON 响应

async fn json() -> Json<serde_json::Value> {
    Json(serde_json::json!({"hello":"axum.rs"}))
}

Result 响应

// Result<T,E> 要求T和E均实现了IntoResponse
async fn result() -> Result<&'static str, StatusCode> {
    let flag = false;
    if flag {
        Ok("Hello, axum.rs")
    } else {
        Err(StatusCode::INTERNAL_SERVER_ERROR)
    }
}

当 flag==false 时,使用 curl 访问:

$ curl -i http://127.0.0.1:9527/result
HTTP/1.1 500 Internal Server Error
content-length: 0
date: Mon, 15 Nov 2021 08:35:03 GMT

自定义结构体响应

#[derive(Serialize)]
struct Info {
    web_site: String,
    email: String,
    level: i32,
}

async fn info_struct() -> Json<Info> {
    let info = Info {
        web_site: "https://axum.rs".to_string(),
        email: "[email protected]".to_string(),
        level: 123,
    };
    Json(info)
}

响应自定义错误

自定义一个错误类型

pub struct AppError {
    pub message: String,
}

让这个自定义错误类型实现 IntoResponse

impl IntoResponse for AppError {
    type Body = Full<Bytes>;
    type BodyError = Infallible;

    fn into_response(self) -> axum::http::Response<Self::Body> {
        self.message.into_response()
    }
}

响应这个错误类型

async fn app_error() -> Result<&'static str, AppError> {
    let flag = false;
    if flag {
        Ok("Hello, axum.rs")
    } else {
        Err(AppError {
            message: "Opps!".to_string(),
        })
    }
}

本章讨论了 axum 内置的各种响应及如何响应自定义结构体和自定义错误,本章源码你可以在代码仓库中找到。

思考题:

如果细心的话,你会发现在上面的例子中(axum 默认情况下),中文大概率会显示成乱码,利用本章所学知识,你能解决这个问题吗?请自行思考再看答案。

提示:HTTP 中的 content-type header 可以指定响应的类型和编码。

参考答案:

async fn cn() -> (HeaderMap, &'static str) {
    let mut headers = HeaderMap::new();
    headers.insert(
        HeaderName::from_static("content-type"),
        HeaderValue::from_static("text/plain;charset=utf-8"),
    );
    (headers, "你好,axum.rs")
}

标签:各种,axum,响应,rs,headers,async,fn
From: https://www.cnblogs.com/pythonClub/p/17804749.html

相关文章

  • 在axum中获取请求数据
    在日常开发中,我们需要与用户进行交互,从各种渠道获取用户输入,包括但不限于:表单、URL参数、URLPath以及JSON等。axum为我们提供了这些获取用户输入的支持。获取 Path 参数Path 参数,又称为“路径参数”,它既可以实现参数的传递,又对SEO友好。什么是 Path 参数假设有以......
  • axum 操作 Postgres 数据库
    PostgreSQL是一款天然支持异步操作的高性能开源关系型数据库。本章将讨论如何在axum中使用PostgreSQL。包括:数据的增加、修改、删除、查找以及开始事务保证业务的原子性。如果你对PostgreSQL不是很了解,可以通过PostgreSQL轻松学网站进行学习。ElephantSQL提供了免费的Po......
  • axum处理cookie
    Cookie是通过HTTPHeader进行传递的。由某个响应头进行设置,然后其它请求头就可以获取到了。本章将通过模拟用户中心来用axum操作HTTPHeader演示Cookie的读写操作。本章示例将实现以下路由:路由说明GET/用户中心首页。如果用户未登录,显示提示信息;如果用户已登......
  • axum 操作 redis
    通过 redis-rs 这个crate,可以很方便的操作redis。它提供了同步和异步两种连接,由于我们要集成到axum中,所以这里使用异步连接。本章将展示如何获取redis异步连接、如何将字符串保存到redis、如何获取到保存在redis里的字符串以及如何通过redis保存和读取自定义结构体。......
  • axum处理静态文件
    和其它Web框架一样,axum也会对所有请求进行处理。对于CSS、JS及图片等静态文件,并不需要axum的handler进行处理,而是只需要简单的把它们的内容进行返回即可。axum提供了处理静态文件的中间件。首先,我们创建一个名为 static 的目录,并在其中创建一个 axum-rs.txt 的文......
  • axum的状态共享
    状态共享是指,在整个应用或不同路由之间,共享一份数据。axum提供了方便的状态共享机制,但可能也会踩坑。本章将带你学习如何在axumweb应用中共享状态。如何进行状态共享axum使用 Layer 来实现状态共享。定义路由时,使用 layer() 加入要共享的数据,在需要获取该共享数据的......
  • dspLearning_频率响应的意义以及简单滤波器的设计
    频率响应的意义\[x(n)=sin(0.01\pin)\\H(z)=\frac{0.05+0.05z^{-1}}{1-0.9z^{-1}}\]n=0.:199;%取两百个点x=sin(0.01*pi*n);%2pi/T=omega=0.01pi,故T=200(所以一个周期采样了200个点)b=[0.05,0.05];a=[1,-0.9];%b是系统响应z变换的分子系数a是分母系数......
  • SpringBoot数据响应、分层解耦、三层架构
    响应数据@ResponseBody类型:方法注解、类注解位置:Controller方法、类上作用:将方法返回值直接响应,如果返回值类型是实体对象/集合,将会转换为json格式响应说明:@RestController=@Controller+@ResponseBody统一响应结果步骤:获取员工数据,返回统一响应结果,在页面渲染......
  • R语言VAR模型的不同类型的脉冲响应分析|附代码数据
     最近我们被客户要求撰写关于VAR模型的研究报告,包括一些图形和统计输出。目录模型与数据估算值预测误差脉冲响应识别问题正交脉冲响应结构脉冲反应广义脉冲响应参考文献脉冲响应分析是采用向量自回归模型的计量经济学分析中的重要一步。它们的主要目的是描述模型变量对一个或多个......
  • java 开发中VO、PO、DO、DTO、BO、QO、DAO、POJO各种傻傻分不清
    VO(ValueObject):值对象,主要用于业务层之间的数据传递,是方法返回类型。例如,一个方法需要返回用户的信息,可以创建一个UserVO,包含用户的姓名、年龄等信息。PO(PersistentObject):持久化对象,用于表示数据库中的一条记录,与数据库表一一对应。例如,数据库中有一个用户表,可以创建一个Use......