【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest

简介: 【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest



前言

reqwest 是一个简单而强大的 RUST HTTP 客户端,用于浏览器异步 HTTP 请求。支持 xmlHttpRequest, JSONP, CORS, 和 CommonJS 约束。

Reqwest 简单易用,功能强大,包括异步和阻塞模式,可以处理各种类型的请求数据,支持 HTTP 代理、TLS 加密、Cookie 存储等功能,另外还包括了对 WASM 的支持。


一、安装与引用

在项目的 Cargo.toml 中添加依赖:

[dependencies]
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }

然后在你的程序中引用该库

use std::collections::HashMap;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let resp = reqwest::get("https://httpbin.org/ip")
        .await?
        .json::<HashMap<String, String>>()
        .await?;
    println!("{:#?}", resp);
    Ok(())
}

以上代码引用了reqwest库,并且创建了一个请求,这个请求的api是

https://httpbin.org/ip

返回当前请求浏览器的ip地址,也就是你当前的ip地址。

运行该示例,看看效果

可以看到,获取到了api返回的json信息,里面包含我当前的ip地址。

二、用法

1. 创建GET请求

如果是单个请求,可以使用get方法

let body = reqwest::get("https://www.rust-lang.org")
    .await?
    .text()
    .await?;
println!("body = {:?}", body);

如果你还要进行其他的多个请求,最好创建个Client进行复用。

2. 创建POST请求

有以下几种方式你可以设置POST请求体(body)。

1.最基本的方法就是使用RequestBuilder的body方法。只需要设置body的原始数据就好。它接收各种类型,包括String和Vec<u8>。如果你想自定义类型,你可以使用reqwest::Body结构。

let client = reqwest::Client::new();
let res = client.post("http://httpbin.org/post")
    .body("the exact body that is sent")
    .send()
    .await?;

2. 表单

在请求体中发送表单数据是非常常见的。这可以使用任何可以序列化为表单数据的类型来完成。他的类型可以是元组,也可以是HashMap,或者自定义类型,只要你实现了Serialize特质。

// 请求体是`foo=bar&baz=quux`
let params = [("foo", "bar"), ("baz", "quux")];
let client = reqwest::Client::new();
let res = client.post("http://httpbin.org/post")
    .form(&params)
    .send()
    .await?;

3. JSON格式

RequestBuilder上还有一个json方法工具,其工作方式与表单方法类似。它可以接受任何可以序列化为JSON的值。JSON功能是非常有必要的。

// 请求体 `{"lang":"rust","body":"json"}`
let mut map = HashMap::new();
map.insert("lang", "rust");
map.insert("body", "json");
let client = reqwest::Client::new();
let res = client.post("http://httpbin.org/post")
    .json(&map)
    .send()
    .await?;

4. 重定向

默认Client会自动的处理重定向,,最大重定向链为10跳。要想自定义这个行为,可以“redirect::Policy”与“ClientBuilder”一起使用。

一个URL,重定向到另一个URL,若是直接跳转,为1跳;若其中夹着一个中转,那么就是2跳,中间夹着N个中转,那就是N+1跳。

5. Cookies

可以使用ClientBuilder上的cookie_store方法启用会话cookie的自动存储和发送。

6. 代理

系统代理默认是启用的

如果你用的是Socks,代理http和https可以使用环境变量http_proxy和https_proxy来提供代理,你可以这么设置代理(仅Linux环境)

export https_proxy=socks5://127.0.0.1:1086

如果你是Windows环境,那么可以用一个reqwest::Proxy结构体,例如

let proxy = reqwest::Proxy::http("https://secure.example")?;

其中"https://secure.example"是个获取代理的URL。此代理会拦截所有请求,然后使用"https://secure.example"的代理。

可以为客户端配置多个代理规则。客户端将按照添加的顺序检查每个代理。这可能意味着,首先添加带有优先拦截规则的代理,如Proxy::all,将阻止列表中后面的代理工作,因此请小心。

启用socks代理

let proxy = reqwest::Proxy::http("socks5://192.168.1.1:9000")?;

7. 使用阻塞请求

阻塞客户端将阻塞要当前线程的执行,而不是直接返回继续执行。但是reqwest::blocking中的功能不能在异步运行时内执行,否则在尝试阻塞时会死机。

在项目的 Cargo.toml 中添加依赖:

reqwest = { version = "0.11", features = ["blocking", "json"] }

然后代码这么写

use std::collections::HashMap;
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let resp = reqwest::blocking::get("https://httpbin.org/ip")?
        .json::<HashMap<String, String>>()?;
    println!("{:#?}", resp);
    Ok(())
}
1. 创建GET请求

阻塞Response 结构体实现了Rust的Read特质,因此许多有用的标准库和第库都有方便的方法,可以在任何可以接受读取的地方获取响应。

let body = reqwest::blocking::get("https://www.rust-lang.org")?
    .text()?;
println!("body = {:?}", body);

注意,如果你想要发多个请求,建议创建个Client

2. 创建POST请求

创建POST请求与非阻塞的基本上是一致的,但是如果你想自定义请求体类型的话,就需要使用reqwest::blocking::Body::new()构造方法,也是只有这里与非阻塞的不同,其他的请参考非阻塞的。

let client = reqwest::blocking::Client::new();
let res = client.post("http://httpbin.org/post")
    .body("the exact body that is sent")
    .send()?;

总结

本期内容学习了纯 Rust 编写的 HTTP 客户端——reqwest,学了其请求HTTP接口的一些方法,

  • 创建GET、POST请求
  • 使用代理
  • 重定向
  • 处理Cookies

该库在各类编程语言中,基本上都属于比较重要的一部分,能够发起请求,就可以与web服务器进行交互,能够进行交互,就可以实现更多功能,它必将成为后续相当重要的一部分。

目录
相关文章
|
17天前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
29 1
使用Netty实现文件传输的HTTP服务器和客户端
|
19天前
|
Rust 监控 编译器
解密 Python 如何调用 Rust 编译生成的动态链接库(一)
解密 Python 如何调用 Rust 编译生成的动态链接库(一)
30 2
|
19天前
|
Rust 安全 Python
解密 Python 如何调用 Rust 编译生成的动态链接库(二)
解密 Python 如何调用 Rust 编译生成的动态链接库(二)
22 1
|
19天前
|
JSON 网络协议 网络安全
详解新一代 HTTP 请求库:httpx
详解新一代 HTTP 请求库:httpx
33 1
|
1月前
|
数据采集 JSON API
🎓Python网络请求新手指南:requests库带你轻松玩转HTTP协议
本文介绍Python网络编程中不可或缺的HTTP协议基础,并以requests库为例,详细讲解如何执行GET与POST请求、处理响应及自定义请求头等操作。通过简洁易懂的代码示例,帮助初学者快速掌握网络爬虫与API开发所需的关键技能。无论是安装配置还是会话管理,requests库均提供了强大而直观的接口,助力读者轻松应对各类网络编程任务。
99 3
|
1月前
|
机器学习/深度学习 JSON API
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
在数据驱动的时代,网络数据抓取对于数据分析、机器学习等至关重要。HTTP协议作为互联网通信的基石,其重要性不言而喻。Python的`requests`库凭借简洁的API和强大的功能,成为网络数据抓取的利器。本文将通过实战演练展示如何使用`requests`库进行数据抓取,包括发送GET/POST请求、处理JSON响应及添加自定义请求头等。首先,请确保已安装`requests`库,可通过`pip install requests`进行安装。接下来,我们将逐一介绍如何利用`requests`库探索网络世界,助你成为数据抓取大师。在实践过程中,务必遵守相关法律法规和网站使用条款,做到技术与道德并重。
41 2
|
1月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
61 3
|
1月前
|
数据采集 网络协议 API
HTTP协议大揭秘!Python requests库实战,让网络请求变得简单高效
【9月更文挑战第13天】在数字化时代,互联网成为信息传输的核心平台,HTTP协议作为基石,定义了客户端与服务器间的数据传输规则。直接处理HTTP请求复杂繁琐,但Python的`requests`库提供了一个简洁强大的接口,简化了这一过程。HTTP协议采用请求与响应模式,无状态且结构化设计,使其能灵活处理各种数据交换。
67 8
|
1月前
|
JSON API 开发者
Python网络编程新纪元:urllib与requests库,让你的HTTP请求无所不能
【9月更文挑战第9天】随着互联网的发展,网络编程成为现代软件开发的关键部分。Python凭借简洁、易读及强大的特性,在该领域展现出独特魅力。本文介绍了Python标准库中的`urllib`和第三方库`requests`在处理HTTP请求方面的优势。`urllib`虽API底层但功能全面,适用于深入控制HTTP请求;而`requests`则以简洁的API和人性化设计著称,使HTTP请求变得简单高效。两者互补共存,共同推动Python网络编程进入全新纪元,无论初学者还是资深开发者都能从中受益。
45 7
|
2月前
|
Rust 搜索推荐 算法
Massa用到的主流Rust库列表
这篇文章展示了Massa项目在构建和运行时所依赖的一系列Rust库。这些库包括但不限于用于WebAssembly的`wasmer`,用于异步编程的`tokio`,用于处理日期和时间的`chrono`,以及用于加密的`aes-gcm`等。特别提到了`zstd-sys`这个库的版本`v2.0.8+zstd.1.5.5`,用于Zstandard压缩算法。文章还列出了其他多个库的版本信息,反映了Massa项目在Rust生态系统中的技术栈。
27 3