有三个冷门的问题(但应该要有解...)
- [已解決]axum预设http标头
"content-type"
预设是"text/plain"
我想实现将所有等于"text/plain"
高效的自动转换成"text/plain; charset=utf-8"
我应该如何实现。 (目前想到使用中间件) (注明一下: 我知道可以使用async fn index() -> (HeaderMap, String) {...}
但是这超级麻烦,想一次控制全部的标头也方便日后更改。
//ex:
async fn handler() -> String {} // 预设是"text/plain"
async fn handler() -> &'static str {} // 预设是"text/plain"
- axum中的tower中间件应该如何使用,axum官方给的中间件预设有一些奇怪的操作,很不解干嘛用的,例如官方示例axum:writing-your-own-middleware
这是什么,这两行在我每次响应时都会做一次clone
self.inner.clone();
怎么会在axum这里看到这样奇怪的操作,这不是浪费资源吗? 我映像中这样的操作有成本的除非是Rc、Arc...
// best practice is to clone the inner service like this
// see https://github.com/tower-rs/tower/issues/547 for details
let clone = self.inner.clone();
let mut inner = std::mem::replace(&mut self.inner, clone);
- 我一直在想axum 怎么做权限控制,我一直希望有个能像rocket: 权限控制作法一样或是替代品,axum有吗?如果真的没有有人可以提供我解决方法吗?
1
共 6 条评论, 1 页
评论区
写评论下面的伙计已经写了解决方法,这里写一下我的方法。
这里的话首先对content-type全部替换了一遍,请求/的时候会对Authorization头后面的数字进行判断是否能被2整除,可以的话用handle的Extension extractor提取出来成功鉴权的数字并响应,不能的话就重定向到/login
再来说说第二个问题,axum文档中给出的Middleware完整实例源码:
其中这两行:
是所有权处理,将对inner的借用,变成对inner的拥有。因为下面async move需要将inner所有权完全转移到future代码片段中。clone是浅复制,mem:replace是深复制。通过这两行,产生一个与self.inner内容一模一样的,拥有所有权的变量,取名叫inner。
服务端启动后可以通过curl命令行测试:
在http请求头部提供authorization:secret的情况下可以访问/api下面的页面,否则跳转到/login。
另外说一下,前几天我写的axum_utf8.rs改一下可以减少对bytes与http-body的外部依赖,axum内部公开了对bytes与http-body的引用,axum::body=crate::http_body, axum::body::bytes=crate::bytes。
亲,权限控制实例代码新鲜出炉:
服务器端提供两类页面,一类是公开访问页面,不需要授权,如主页,登录页面;另一类是获得授权才能访问的页面,实例代码中放置在uri为/api/*下面。服务将检查Request头部的authorization字段, 审核通过返回需要的页面,审核失败调转到登录页面。
好的感谢你,第一个方法已经成功。 但是对于权限管理还是一头雾水...。
--
👇
c5soft: 第一个问题,我也碰到了,直接贴出我写的源代码axum_utf8.rs
除了Plain,axum_utf8.rs中顺便也增加了utf8版的Html。
第二个问题与第三个问题需要花时间去研读tower/tower-http, 都是如何使用中间件的问题,读懂tower,一切明了。
第一个问题,我也碰到了,直接贴出我写的源代码axum_utf8.rs
需要在Cargo.toml增加对bytes于http-body的依赖,main.rs中的写法:
除了Plain,axum_utf8.rs中顺便也增加了utf8版的Html。
第二个问题与第三个问题需要花时间去研读tower/tower-http, 都是如何使用中间件的问题,读懂tower,一切明了。