Rust网络请求神器reqwest介绍和使用,5分钟速学

在 Rust 生态中,reqwest 可以说是最流行的 HTTP 客户端库了。它提供了一个高层级的、人性化的 API,让我们可以非常轻松地发送各种 HTTP 请求和处理响应。无论是 quickstart、自定义请求头、cookie 管理,还是文件上传,reqwest 都能帮我们优雅地搞定。

官网依赖地址:https://crates.io/crates/reqwest

github仓库地址:GitHub - seanmonstar/reqwest: An easy and powerful Rust HTTP Client

主要特性

通过查阅 reqwest 的文档和源码,我发现它主要有以下特性:

  1. 支持异步和阻塞两种客户端

  2. 可以发送纯文本、JSON、表单、多部分等多种类型的请求体

  3. 自定义重定向策略

  4. 支持 HTTP 代理

  5. 默认通过系统原生 TLS 实现 HTTPS(也可选择 rustls)

  6. 内置 Cookie 管理

  7. 支持 WASM

感觉非常强大,下面我们就用几个简单的例子,快速上手这个库!

发送一个 GET 请求

首先来看一个最简单的 GET 请求,访问 http://httpbin.org/ip 接口获取本机 IP。这里必须说一下,因为请求是异步的,所以还需要有tokio这个异步运行时的知识,我也发过一篇文章来说明这个tokio怎么使用:Rust异步并发编程tokio异步运行时讲解和使用,新手必学-CSDN博客。

而且因为响应式json格式的数据,所以还需要有serde_json这个json序列化相关的知识,可以看之前我发过的文章:5分钟学会Rust语言如何使用serde_json操作JSON-CSDN博客

接下来就可以看一下我们发送一个get请求,并获取到json相应的操作了:

use std::collections::HashMap;
use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct Res {
    origin: String,
}

#[tokio::main]
async fn main() {
    // 发送get请求
    let response = reqwest::get("https://httpbin.org/ip").await.unwrap();
    // 获取文本字符串响应内容
    let res_text = response.text().await.unwrap();
    println!("response text value is: {res_text:?}");
    // 将文本字符串转为结构体
    let res_json: Res = serde_json::from_str(&res_text).unwrap();
    println!("res_json value is: {res_json:?}");
    // 或者直接在reqwest响应时转为hashmap
    let res_map = reqwest::get("https://httpbin.org/ip").await.unwrap().json::<HashMap<String, String>>().await.unwrap();
    println!("res hashmap value is: {res_map:?}");
}

这段代码中:

  1. 通过 reqwest::get 发送一个 GET 请求

  2. 通过 resp.json::<HashMap<String, String>>()将响应解析为 HashMap

  3. 打印出解析后的结果

运行后输出:

response text value is: "{\n  \"origin\": \"116.232.39.24\"\n}\n"
res_json value is: Res { origin: "116.232.39.24" }
res hashmap value is:{"origin": "116.232.39.24"}

发送 POST 表单请求

我们再来试试 POST 请求。比如用 reqwest 提交一个登录表单。

// This will POST a body of `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?;

发送JSON请求

RequestBuilder 上还有一个 json 方法助手,它以类似于 form 方法的方式工作。它可以采用任何可以序列化为 JSON 的值。特性 json 是必需的。

// This will POST a body of `{"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?;

Cookies管理

通过 ClientBuilder 上的 cookie _ store 方法,可以启用会话 Cookie 的自动存储和发送。

为客户端启用持久性 Cookie 存储:在响应中收到的 Cookie 将被保留并包含在其他请求中。

默认情况下,不使用 Cookie 存储。使用 cookie _ store (true)启用 cookie 存储将把存储设置为默认实现。如果使用 cookie _ Provider (my _ cookie _ store) ,则不必调用 cookie _ store (true) ; 在 cookie _ Provider (my _ cookie _ store)之后调用 cookie _ store (true)将导致提供的 my _ cookie _ store 被默认实现覆盖。

需要开启cookies特性才可以使用:

使用的时候:

// 自定义client,指定相关配置
// 开启cookie支持
let client = reqwest::Client::builder()
        .cookie_store(true)
        .build()
        .unwrap();
let res = client.get(url.trim())
        .send()
        .await
        .unwrap();

配置Proxy

注意:默认情况下启用系统代理。系统代理查看环境变量来设置 HTTP 或 HTTPS 代理。HTTP_PROXY或http_proxy为 http 连接提供 http 代理,同时 HTTPS_PROXY为https_proxyHTTPS 连接提供 HTTPS 代理。Proxy这些可以通过向ClientBuilder ie添加 来覆盖let proxy = reqwest::Proxy::http("https://secure.example")?; 或通过调用禁用ClientBuilder::no_proxy()。socks如果您像这样配置了socks代理,则需要该功能:

export https_proxy=socks5://127.0.0.1:1086

    let params = [("foo", "bar"), ("baz", "quux")];
    let proxy = reqwest::Proxy::http("https://secure.example").unwrap();
    let client = reqwest::Client::builder()
        .cookie_store(true)
        .proxy(proxy)
        .build()
        .unwrap();

注意事项

注意:如果您计划执行多个请求,最好创建一个请求 Client并重用它,利用保持活动的连接池。  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

了解Cookie登录:原理、实践与安全指南

什么是Cookie登录&#xff1f; Cookie是什么 当你首次登录网站时&#xff0c;你会输入用户名和密码。在后台&#xff0c;网站的服务器验证这些凭据是否正确。一旦确认你的身份无误&#xff0c;服务器就会创建一个Cookie&#xff0c;并将其发送到你的浏览器。这了解Cookie登录…

38-数组 _ 一维数组

38-1 数组的创建 数组是一组相同类型元素的集合。 数组的创建方式&#xff1a; type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n是一个常量表达式&#xff0c;用来指定数组的大小 举例&#xff1a; int arr[10]; char ch[5]; double data[20]; 问&…

HarmonyOS 实战开发-MindSpore Lite引擎进行模型推理

场景介绍 MindSpore Lite 是一款 AI 引擎&#xff0c;它提供了面向不同硬件设备 AI 模型推理的功能&#xff0c;目前已经在图像分类、目标识别、人脸识别、文字识别等应用中广泛使用。 本文介绍使用 MindSpore Lite 推理引擎进行模型推理的通用开发流程。 基本概念 在进行开…

vscode连接远程Linux服务器时,没有权限新建文件夹或者文件

参考链接&#xff1a; VS code 保存或新建文件没有权限的问题 vscode连接远程Linux服务器时&#xff0c;没有权限新建文件夹或者文件&#xff1a; 用一条命令解决&#xff1a; sudo chown -R myuser /path/to/foldermyuser是当前用户名&#xff0c; /path/to/folder是 需要操…

编程学习路线

Java最强学习路线 快来官网定制一套属于自己的学习路线吧 官方网址&#xff1a; Learn to become a modern Java developerCommunity driven, articles, resources, guides, interview questions, quizzes for java development. Learn to become a modern Java developer by…

运维笔记:基于阿里云跨地域服务器通信(上)

运维笔记 阿里云&#xff1a;跨地域服务器通信&#xff08;上&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

【嵌入式AI开发】轻量级卷积神经网络MobileNet项目实战——文末完整源码工程文件

前言:本文介绍轻量级卷积神经网络MobileNet网络实战,包含MobileNetV1、MobileNetV2、ResNet50三个预训练模型可供选择。 实现:1.预训练MobileNet图像分类,2.调用摄像头实时MobileNet图像分类,3.MobileNet视频图像分类。 MobileNet网络理论详解:【嵌入式AI开发】轻量级卷…

git提交常用

git config --global user.name "你的名字或昵称" git config --global user.email "你的邮箱" 第一次上传到码云 1.找到要提交到码云的文件夹 右击打开Git Bash Here 2.用命令行创建本地仓库 git init 3.将待全部文件放入缓冲区 git add . 4.提交缓…

优化贪吃蛇在前进过程中,前进和后退的问题

1. 左边为head,右边为tail 定义相反数在abs&#xff08;&#xff09;绝对值函数中实现 2. 在转向函数turn()中&#xff0c;如果绝对值不相等的时候才赋予方向的值 3.贪吃蛇吃食物的思路 3.1 初始化食物initFood(), 蛇碰到食物函数hasFood&#xff08;&#xff09;,在移…

如何用Python实现智能客服问答系统

随着人工智能技术的不断发展&#xff0c;机器人客服与聊天系统成为了热门话题。Python作为一种简单易学、功能强大的编程语言&#xff0c;在机器人客服与聊天系统的开发中具有广泛应用。 本文将介绍如何使用Python实现机器人客服与聊天系统&#xff0c;包括实现方式、代码示例和…

Mysql-主从复制理解

环境&#xff1a;mysql&#xff0c;主从复制&#xff0c;必须有2个mysql实例&#xff0c;也就是说可以在一台电脑上安装2个msyql&#xff0c;或者2台服务器&#xff0c;一个主服务器&#xff0c;一个从服务器 在实际的生产中&#xff0c;为了解决Mysql的单点故障已经提高MySQL的…

【Unity动画系统】动画基本原理与Avater骨骼复用

动画基本原理 动画片段文件是一个描述物体变化状态的文本文件 在Unity中创建的资源文件大多都是YAML语言编写的文本文件 Curves表示一种变化状态&#xff0c;为空的话则没有记录任何内容 位置变化后的旋转变化状态&#xff1a; 动画文件里的Path名字要相同才能播放相同的动画 …

外贸财务挑战面面观:应对难题之道大揭秘!

出海也开始卷起来了。越来越多的中国企业投身海外市场&#xff0c;寻求更广阔的发展空间。然而&#xff0c;出海之路并非坦途&#xff0c;企业既需把握全球商机&#xff0c;又需应对数字化转型、本土化运营、文化差异性等多重挑战。企业出海&#xff0c;该如何应对这些风浪&…

GPU服务器和普通服务器有何区别?

众所周知&#xff0c;服务器是网络中的重要设备&#xff0c;要接受少至几十人、多至成千上万人的访问&#xff0c;因此对服务器具有大数据量的快速吞吐、超强的稳定性、长时间运行等严格要求。 GPU服务器和普通服务器的主要区别在于硬件配置和适用场景&#xff0c;特别是处理器…

C 函数递归

目录 什么是递归 递归的限制条件 递归的例子 1、用递归求n的阶乘 递归扩展学习 1、青蛙跳台阶 思路 代码实现 2、汉诺塔问题​ 思路 代码实现 总结 什么是递归 递归&#xff1a;“递推” “回归” 在C语言中&#xff0c;函数递归就是&#xff1a;函数自己调用自…

FANUC机器人SOCKET连接指令编写

一、创建一个.KL文件编写连接指令 创建一个KL文本来编写FANUC机器人socket连接指令 二、KAREL指令代码 fanuc机器人karel编辑器编辑的karel代码如下&#xff1a; PROGRAM SM_CON %COMMENT SOCKET连接 %STACKSIZE 4000 --堆栈大小 %INCLUDE klevccdfVAR status,data_type,in…

武汉星起航:成功挂牌新起点,董事长张振邦引领行业再攀高峰

2023年10月30日&#xff0c;对于武汉星起航电子商务有限公司而言&#xff0c;是一个具有里程碑意义的日子。这一天&#xff0c;公司在上海股权托管交易中心成功挂牌展示&#xff0c;正式登陆资本市场&#xff0c;开启了公司发展的新篇章。这一创举不仅彰显了公司在跨境电商领域…

刷题日记 ---- 顺序表与链表相关经典算法题(C语言版)

目录 1. 移除元素2. 合并两个有序数组3. 移除链表元素4. 反转链表5. 合并两个有序链表6. 链表的中间结点7. 环形链表的约瑟夫问题8. 分割链表总结 正文开始 1. 移除元素 题目链接: 移除元素 题目描述: 思路历程: 题目明确要求, 不能使用额外的数组空间, 也就是说不可以创建…

新时代凌迟:考研

我不喜欢上班&#xff0c;但我很欣赏老板的品味&#xff0c;因为咱们公司竟然还在订阅报纸&#xff0c;而且只有一份&#xff0c;《中国青年报》。 这份报纸我最喜欢看的是“冰点周刊”专栏&#xff0c;因为这个栏目能让读者相信&#xff1a;报纸远远可以超越一天的生命。 昨天…

类和对象【三】析构函数和拷贝构造函数

文章目录 析构函数析构函数的定义析构函数的作用主要作用次要作用 析构函数的特点 拷贝构造函数拷贝构造函数的定义拷贝构造函数的作用主要作用次要作用 拷贝构造函数的特点浅拷贝和深拷贝浅拷贝深拷贝 拷贝构造函数的调用场景 析构函数 析构函数的定义 析构函数(destructor) …