
【Rust每周“一”库】async http三剑客
发布日期:2021-05-20 06:54:48
浏览次数:18
分类:精选文章
本文共 2375 字,大约阅读时间需要 7 分钟。
好的!以下是优化后的内容:
本文是Yoshua Wuyts大体博客关于async http文章的翻译,原文地址为https://blog.yoshuawuyts.com/async-http/。
Friedel Ziegelmayer、Ryan Levick与我共同推荐一组高效的HTTP库,您可以利用它们轻松开发异步的加密HTTP/1.1服务器端和客户端。它们是:
- async-h1:支持streaming的HTTP/1.1客户端与服务器端协议实现
- http-types:从Tide和Surf框架中提取的可复用的HTTP组件
- async-native-tls:支持stream与TLS的服务器端与客户端实现
通过这些库,您可以在15行代码内创建加密的基于stream的HTTP客户端,比如:
use async_std::io::prelude::*;use async_std::net::TcpStream;use http_types::{Method, Request, Url};#[async_std::main]async fn main() -> http_types::Result<()> { // 建立TCP连接 let stream = TcpStream::connect("127.0.0.1:8080").await?; let peer_addr = stream.peer_addr()?; // 创建一个请求 let url = Url::parse(&format!("https://{}/foo", peer_addr))?; let req = Request::new(Method::Get, url); // 加密TLS连接 let host = req.url().host_str()?; let stream = async_native_tls::connect(host, stream).await?; // 通过加密信道发送请求 let res = async_h1::connect(stream, req).await?; println!("{:?}", res); Ok(())}
而构建一个异步HTTP服务器则仅需30行代码左右(如代码中所示),大部分代码涵盖导入、循环和打印操作。
对于证书管理,只需在客户端代码中添加几行即可实现加密通信:
use async_std::fs::File;let key = File::open("identity.pfx").await?;let pass = "";let listener = TcpListener::bind("127.0.0.1:8080").await?;let (stream, _) = listener.accept().await?;let stream = async_native_tls::accept(key, pass, stream).await?;
STREAM的核心价值
我们的库设计专注于stream,因为Rust的stream机制提供了极高的可组合性。例如,使用surf
库将HTTP请求的体复制到文件中,只需两行代码: let req = surf::get("https://example.com").await?;io::copy(req, File::open("example.txt")).await?;
我们希望这种可组合性不仅体现在框架层面,而是延伸到协议层面,相信通过更灵活的技术栈组件,整个生态系统将更易于使用这种异步技术。
共享抽象的重要性
最初我们使用hyperium/http
库,但发现其缺乏某些关键功能,如HTTP体支持和状态码管理。因此,我们开发了http-types
库,它从Tide和Surf中提取了共享组件,为异步HTTP提供了更具扩展性的抽象。 错误处理
http-types
引入了一种与状态码相关的错误类型,基于David Tolnay的anyhow
轻量级错误处理库。我们的Error
类型可以将任何错误转化为带有状态码的错误,而ResultExt
trait则提供了快速获取状态码的方法: /// 获取文件的字节数async fn file_length(p: Path) -> http_types::Result{ let b = fs::read(p).await.status(501)?; Ok(b.len())}
TRAIT转换
我们在错误处理之外,几乎所有类型都实现了AsRef
和AsMut
trait,这类似于rustwasm
中的web-sys
库,允许将各种对象作为引用传递。例如,Request
和Response
都实现了这些trait,以支持灵活的操作。 兼容性
我们的技术栈兼容性强,支持通过UnixStream
替换TcpStream
实现跨进程通讯,无需重新编写代码或 fork 项目。同时,http-types
通过实现From
和Into
trait,与hyperium/http
库保持兼容。 设计哲学
我们的设计理念以减少障碍为导向,尝试回答诸如:异步Rust HTTP库应该长什么样?是否需要配置TCP与TLS?HTTP/1.1能否基于stream实现?我们通过极少量新trait和符合Rust命名规范的库设计,目标是在保持性能的同时,创造易于上手、使用和维护的工具。以上为优化后的文本,您可以根据具体需求进行调整或补充!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月24日 01时42分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
微信小程序云开发:怎么删除云函数?已解决
2019-03-15
第一次被黑
2019-03-15
PyCharm配置anaconda环境
2019-03-15
SpringBoot与缓存(JSR-107、Spring缓存抽象)
2019-03-15
ERROR 总结
2019-03-15
查找最小值栈的O(1)
2019-03-15
Java面试题整理,闭关在家37天“吃透”这份345页PDF,纯干货
2019-03-15
概念唱片Plastic Beach封面高清壁纸
2019-03-15
旅游后期效果Ography Lightroom预设
2019-03-15
vue项目报错集合
2019-03-15
图片链接
2019-03-15
LINUX-WIFI无线接入的一些东西
2019-03-15
word文档手写字母总会大写问题
2019-03-15
Redis中的key
2019-03-15
juc-09-控制并发流程工具类
2019-03-15
第一节 docker安装
2019-03-15
Spring 和 DI 依赖注入
2019-03-15
中序线索二叉树的遍历
2019-03-15