warp框架教程5-Filter系统中各个模块

news2024/11/24 21:08:14

any 模块

any 模块只有一个方法,就是 any 方法,它可以匹配任何路由的过滤器。我们可以使用 any 方法将一些可克隆的资源转换成一个过滤器,从而允许轻松地将它与其他 Filter 结合在一起。当然也可以使用 any 方法创建适用于多个 Filter 的末尾调用的 Reply。例如:

use warp::Filter;

let route = warp::any()
    .map(|| {
        "I always return this string!"
    });

这个例子将会匹配任何路由,然后返回 “I always return this string!” 。 文档中的另一个例子是

use std::sync::Arc;
use warp::Filter;

let state = Arc::new(vec![33, 41]);
let with_state = warp::any().map(move || state.clone());

// Now we could `and` with any other filter:

let route = warp::path::param()
    .and(with_state)
    .map(|param_id: u32, db: Arc<Vec<u32>>| {
        db.contains(&param_id)
    });

通过 any,我们将 state 成功转换成为一个 Filter,然后我们就能将 state 和其他 Filter 结合起来使用。

body 模块

body 模块用来提取请求中的 body, 它提供了一些方法,如下所示:
在这里插入图片描述
不过,现代的web api通常只使用 json 来进行通信。文件上传,下载之类的可能会交给专门的文件服务系统,因此可能也很少使用 form,stream,bytes,aggregate。如果需要使用,可以自行查看文档。而限制请求体的大小,我们更多可能是通过反向代理服务器来进行限制,而不是使用 content_length_limit。

因此,我们通常需要使用的方法只剩下一个,那就是 json, 使用 json 方法可以提取json 反序列化后的内容,前提是我们需要安装 serde_json 来提供反序列化的能力。在第一篇的时候,我们已经安装了 serde 和 serde_json

compression 模块

在 compression 模块,提供了 brotli,gzip,default 三种压缩方式的方法。如下所示:
在这里插入图片描述
压缩功能通常由静态服务器实现。当客户端向服务器请求静态资源(如HTML、CSS、JavaScript文件)时,服务器可以应用压缩算法对这些文件进行压缩,并将压缩后的文件发送给客户端。这样可以减少传输的数据量,加快页面加载速度,并降低带宽消耗。

动态服务器主要负责处理动态内容的生成和响应,例如处理用户提交的表单数据、执行数据库查询等。压缩静态资源一般是在静态服务器层面进行的,因为静态资源在每次请求时都可以使用相同的压缩版本,而动态内容则根据每个请求的不同而生成,无法事先进行压缩。

因此,如果你只在 warp 中实现 web api,那么是无需关心压缩问题的。如果你使用模板渲染,前后端不分离的模式,也是可以进行预处理压缩,然后交给静态服务器代理。因此这个问题主要是由静态服务器解决。如果需要使用 compression,可以参考文档。

cookie 模块

cookie 模块有两个方法,可以用于获取HTTP 请求中的携带的cookie,而不是操作响应中的 cookie。
在这里插入图片描述
这两个方法的功能是显而易见的,cookie 方法可以从请求中根据 cookie 名称获取相应的 cookie 值,这个值是必须的,否则将会产生一个 warp::reject::Rejection;而 optional 方法则不要求这个 cookie 是必须的,如果找到,则提取 cookie 的值,否则将继续请求。

cors 模块

cors 模块只有一个方法,就是 cors 方法,使用它可以产生一个 cors 对象,通过该对象,我们可以设置允许的跨域请求方法,允许的跨域来源。
在这里插入图片描述
文档中的 demo 如下所示:

use warp::Filter;

let cors = warp::cors()
    .allow_origin("https://hyper.rs")
    .allow_methods(vec!["GET", "POST", "DELETE"]);

let route = warp::any()
    .map(warp::reply)
    .with(cors);

如果你想允许所有请求来源,那么可以这样:

use warp::Filter;
let cors = warp::cors()
    .allow_any_origin();

这是 warp 给我们提供的跨域处理。你可以选择使用它,或者也可以在反向代理服务器(例如:Nginx, Apache)处进行跨域的处理。毕竟解决跨域的方式比较多,实际中常用的可能是在反向代理处处置跨域。

ext 模块

这个模块的作用未知,翻看了一下 warp 的源码,发现了下面的使用方式,但是现在版本的 warp 根本没有这个 set 方法。

#![deny(warnings)]
extern crate warp;

use warp::Filter;

#[derive(Clone, Debug, PartialEq)]
struct Ext1(i32);

#[test]
fn set_and_get() {
    let ext = warp::any()
        .map(|| {
            warp::ext::set(Ext1(55));
        })
        .untuple_one()
        .and(warp::ext::get::<Ext1>());

    let extracted = warp::test::request().filter(&ext).unwrap();

    assert_eq!(extracted, Ext1(55));
}

#[test]
fn get_missing() {
    let ext = warp::ext::get().map(|e: Ext1| e.0.to_string());

    let res = warp::test::request().reply(&ext);

    assert_eq!(res.status(), 500);
    assert_eq!(res.body(), "Missing request extension");
}

#[test]
#[should_panic]
fn set_outside_of_filter_should_panic() {
    warp::ext::set(Ext1(55));
}

从这个例子来看,就是可以设置一个值,然后获取。这就导致该模块实际上没什么用,因为我们可以通过 Filter 的 Extract 来带回一个值,然后传递给 map 或者 and_then 中的方法。因此有没有 ext 模块并不影响我们使用 warp。

fs 模块

该模块用来返回一个 file response,在较小的项目下通常是有用的,因为这个时候我们可能不会使用专门的文件系统来存储文件,而是直接在我们的后端 API 中进行处理。(即使是动态生成文件,例如导出Excel,也应该将生成的文件存储在专门的文件系统中。)另外一点就是通常我们都是由静态服务器来处理静态文件的,而不是由动态服务器处理。

它提供的方法如下所示:
在这里插入图片描述
文档中的示例如下所示,都是处理静态文件的。

use warp::Filter;

// Matches requests that start with `/static`,
// and then uses the rest of that path to lookup
// and serve a file from `/www/static`.
let route = warp::path("static")
    .and(warp::fs::dir("/www/static"));

// For example:
// - `GET /static/app.js` would serve the file `/www/static/app.js`
// - `GET /static/css/app.css` would serve the file `/www/static/css/app.css`
// Always serves this file from the file system.
let route = warp::fs::file("/www/static/app.js");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Hook技术实战详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 前言&#xff1a; 什么是Android Hook技术&#xff1f; Android Hook技术是指在Android…

Sentinel流量规则模块(新增)

系统并发能力有限&#xff0c;比如系统A的QPS支持1个请求&#xff0c;如果太多请求过来&#xff0c;那么系统A就应该进行流量控制了&#xff0c;比如其他请求直接拒绝 新增流控规则介绍:新增流控规则窗口 1.资源名&#xff1a;默认请求路径。 2.针对来源&#xff1a;Se…

WebRTC基础

有用的网址&#xff1a; https://webrtc.org/ WebRTC API - Web API 接口参考 | MDN Browser APIs and Protocols: WebRTC - High Performance Browser Networking(OReilly) 浏览器中查看webrtc运行的实时信息&#xff1a; Chrome浏览器&#xff1a;chrome://webrtc-inter…

Linux(Ubuntu2004)实现kitti数据集的点云投影记录

1、新建终端打开roscore roscore 2、在“下载”路径里面播放example_new的bag rosbag play example_new.bag -l 3、在catkin_ws里面运行下列命令 rosrun ros_detection_tracking projector 如果不能运行&#xff0c;可以采用tab的方式查看是否错误 4、新建一个终端运行r…

Kafka 入门到起飞 - 生产者发送消息流程解析

生产者通过send&#xff08;&#xff09;方法发送消息消息会经过拦截器->序列化器->分区器 进行加工然后将消息存在缓冲区当缓冲区中消息达到条件会按批次发送到broker对应分区上broker将接收到的消息进行刷盘持久化消息处理broker会返回给producer响应落盘成功返回元数据…

孟德尔随机化推断暴露因素与健康结局的因果关系

学习视频&#xff1a; 应用孟德尔随机化方法推断暴露因素与健康结局的因果关系 王友信教授 梅斯医学_哔哩哔哩_bilibili http://chinaepi.icdc.cn/zhlxbx/ch/reader/create_pdf.aspx?file_no20170427&flag1&journal_idzhlxbx&year_id2017 1. 孟德尔随机化方法 传…

详细介绍matlab使用支持向量机(SVM)预测股票市场趋势的实例

简介: 股票市场的趋势预测一直是投资者和交易员关注的重要问题之一。支持向量机(SVM)作为一种强大的机器学习算法,被广泛应用于股票市场趋势预测。本实例将介绍如何使用SVM来预测股票市场的涨跌趋势,并提供一个MATLAB代码示例。 数据准备: 首先,我们需要获取股票市场的历…

《面试1v1》Kafka优缺点别用错

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

常用在线AI人工智能效率工具站点导航

详情请前往&#xff1a;常用在线AI人工智能工具站点导航

stm32(HAL库)使用printf函数打印到串口

目录 1、简介 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 串口外设配置 2.3 项目生成 3、KEIL端程序整合 4、效果测试 1、简介 在HAL库中&#xff0c;常用的printf函数是无法使用的。本文通过重映射实现在HAL库中进行printf函数。 2.1 基础配置 2.1.1 SYS配置 2.1.2 …

quartus工具篇——modelsim的使用

文章目录 quartus工具篇——modelsim的使用1、modelsim简介二、使用教程1、新建工程添加文件 2、生成编写仿真文件3、设置仿真4、开启功能仿真5、开启时序仿真6、总结参考视频&#xff1a; quartus工具篇——modelsim的使用 1、modelsim简介 Quartus Prime是一款由英特尔开发…

【JavaEE初阶】博客系统的前端页面设计

文案分享~ 许多人终其一生都想从别人身上找寻爱&#xff0c; 以为爱是自然界的第二个太阳。 却忘了自己才是那道照耀全世界的光。 文章目录 1.博客主要组成页面2.博客列表页3.博客详情页4.博客登录页5.博客编辑页 1.博客主要组成页面 博客主要是由四个页面组成.分别是: 博…

3.3 Bootstrap 按钮组

文章目录 Bootstrap 按钮组基本的按钮组按钮工具栏按钮的大小嵌套垂直的按钮组 Bootstrap 按钮组 按钮组允许多个按钮被堆叠在同一行上。当你想要把按钮对齐在一起时&#xff0c;这就显得非常有用。您可以通过 Bootstrap 按钮&#xff08;Button&#xff09; 插件 添加可选的 J…

数据结构(2.1)——时间复杂度和空间复杂度计算

前言 &#xff08;1&#xff09;因为上一篇博客&#xff1a;数据结构&#xff08;2&#xff09;—算法对于时间复杂度和空间复杂度计算的讲解太少。所以我在次增加多个案例讲解。 &#xff08;2&#xff09;上一篇已经详细介绍了&#xff0c;为什么我们的算法要使用复杂度这一个…

Docker部署jar包运行

目录 场景 方法 运行 场景 springboot项目,打包成jar包&#xff0c;想要放到docker中运行 这种方式就是运行一个jdk的容器&#xff0c;然后挂载其中的目录到宿主机&#xff0c;然后运行之后&#xff0c;就可以将需要运行的jar放在宿主机的挂载目录下&#xff0c;然后每次…

匈牙利算法解决英雄配色问题

匈牙利算法解决英雄配色问题 最近在开发中遇到了这种情况&#xff0c;策划要为每个英雄去做配色&#xff0c;一个英雄在表中可能有多个配色&#xff08;可能重复&#xff09;&#xff0c;每次对局要选出五个英雄并让他们的颜色不同 (实际不是这个&#xff0c;简化成的这个需求)…

nacos面经详解

1 为什么要懂nacos的详细原理&#xff1f; 只要你简历写过你用过nacos&#xff0c;则大厂&#xff08;阿里&#xff09;&#xff0c;尤其是使用过这款产品的大中厂&#xff0c;基本必问其中的原理。里面的设计理念还有很多分布式系统的原理值得学习和深究。 2 分布式理论基础…

进制转换详解(解释原理简单易懂)

前言&#xff1a;在网上看了许多篇关于不同进制之间如何转换的文章&#xff0c;包括很多浏览量上万的博客。大多都只是把转换的规则罗列了出来&#xff0c;例如十进制转二进制&#xff0c;可能大家都知道方法&#xff0c;“除以2反向取余数&#xff0c;直到商为0”。应用该方法…

黎曼猜想的验证

11 for n 1 : 100000 sum sum cos(14.134725*log(n))/(n^(-0.5)) end sum -1.1151e06

IDEA设置自动导包功能

IDEA设置自动导包功能 选择File--Settings--Edotor-General-Auto Import&#xff0c;勾选上下图中的选项后点击 OK 即可。导包无忧~~ Add unambiguous imports on the fly&#xff1a;自动导入不明确的结构 Optimize imports on the fly&#xff1a;自动帮我们优化导入的包