warp框架教程2-log模块,addr模块和header模块

news2024/12/28 8:25:50

log , addr 和 header

从本文开始,我们将介绍 warp 中 Filter 的核心模块。在文档中有 filter 相关模块的介绍, 本文来介绍其中的 addr,header 和 log
在这里插入图片描述

addr 模块

addr 模块非常简单,它是用来获取远程客户端的地址的。使用起来非常简单。文档中也只有一个 remote 方法。
在这里插入图片描述
文档中还给出了 remote 方法的示例。
在这里插入图片描述
我们来改造刚才的 hello world 程序,来获取远程访问地址。

use warp::Filter;

#[tokio::main]
async fn main() {
    // GET /hello/warp => 200 OK with body "Hello, warp!"
    let hello = warp::path!("hello" / String)
        .and(warp::addr::remote())
        .map(|name: String, addr: Option<std::net::SocketAddr>|
            {
                format!("Hello, {}!\nClient IP: {}\n", name, addr.unwrap().to_string())
            });

    warp::serve(hello)
        .run(([0, 0, 0, 0], 3030))      // 监听 0.0.0.0
        .await;
}

这次,我们在代码中使用 and 加上了 remote 方法,并传入闭包中。另外一点是我们更改了 web 的监听地址为 0.0.0.0,来获取所有 IP 的访问。

  1. 在本地使用 curl 访问 在这里插入图片描述
    可以看到打印的访问地址是 127.0.0.1:42260
  2. 在远程使用 postman 访问
    在这里插入图片描述
    通过远程Windows上的 postman 来访问,可以看到显示的 IP 地址是 221.218.142.126:17184

header 模块

header 模块是与请求 HTTP 标头交互,可以帮助我们提取请求头中的参数。该模块的文档如下所示:
在这里插入图片描述
所具备的方法并不是很多。这里不对每个函数进行说明。需要使用相关方法的,请查看相关文档。放在这里介绍 header 模块是因为上面 addr 方式获取到的 IP 在用反向代理的情况下,是不正确的。例如在使用 Nginx 作为代理的时候,我们需要配置 X-Forwarded-For ,然后读取请求头中的 X-Forwarded-For 或者 X-Real-IP 来确定客户端的真实 IP。我们使用 header 模块来读取相关的请求头。

use warp::Filter;

#[tokio::main]
async fn main() {
    // GET /hello/warp => 200 OK with body "Hello, warp!"
    let hello = warp::path!("hello" / String)
        .and(warp::addr::remote())
        .and(warp::header("x-forwarded-for"))
        .and(warp::header("x-real-ip"))
        .map(|name: String, addr: Option<std::net::SocketAddr>, x_forward_for: String, x_real_ip: String|
            {
                format!("Hello, {}!\nClient IP: {}\nX-Forwarded-For: {}\nX-Real-IP: {}\n", 
                    name, addr.unwrap().to_string(), x_forward_for, x_real_ip)
            })
        .with(log);

    warp::serve(hello)
        .run(([127, 0, 0, 1], 3030))      // 监听 127.0.0.1
        .await;
}

和刚才一样,我们分别使用 curl 和 远程 postman 来进行访问。这次,我们访问的端口是 Nginx 的端口 80; 而不是监听的端口3030。

  1. 本地 curl 访问
    在这里插入图片描述
    可以看到,x-forwarded-for 和 x-real-ip 都显示的是 127.0.0.1,并且通过 addr 模块取得的 client IP 也是 127.0.0.1(实际上 addr 模块取得的地址是反向代理所在的IP地址)。
  2. 远程 postman 访问
    在这里插入图片描述
    可以看到 x-forwarded-for 和 x-real-ip 都显示的是 221.218.142.126,获取到了客户端的真实IP,而addr 此时获取的是 Nginx 所在的IP。也就是本机。

获取请求头中所有的字段

使用 header 模块的 headers_cloned 方法可以获取请求头中所有的字段,例如:

use warp::{Filter, hyper::HeaderMap};

#[tokio::main]
async fn main() {
    // GET /hello/warp => 200 OK with body "Hello, warp!"
    let hello = warp::path!("hello" / String)
        .and(warp::addr::remote())
        .and(warp::header("x-forwarded-for"))
        .and(warp::header("x-real-ip"))
        .and(warp::header::headers_cloned())
        .map(|name: String, addr: Option<std::net::SocketAddr>, x_forward_for: String, x_real_ip: String, all_header: HeaderMap|
            {
                println!("{:?}", all_header);
                format!("Hello, {}!\nClient IP: {}\nX-Forwarded-For: {}\nX-Real-IP: {}\n", 
                    name, addr.unwrap().to_string(), x_forward_for, x_real_ip)
            });

    warp::serve(hello)
        .run(([127, 0, 0, 1], 3030))      // 监听 127.0.0.1
        .await;
}

现在,我们使用 postman 来进行访问,增加一个自定义的 Token 字段到 header 中
在这里插入图片描述
请求之后,我们来看一下控制台的输出结果。
在这里插入图片描述

log 模块

在第一篇文章的时候,我们引入了两个日志模块 log 和 pretty_env_logger 。现在是时候排上用场了。我们来配一下日志输出。

use std::env;
use warp::{Filter, hyper::HeaderMap};

#[tokio::main]
async fn main() {
	// 日志输出相关配置
    env::set_var("MYAPP_LOG", "INFO");  
    pretty_env_logger::init_custom_env("MYAPP_LOG");
    let log = warp::log("MYAPP");

    // GET /hello/warp => 200 OK with body "Hello, warp!"
    let hello = warp::path!("hello" / String)
        .and(warp::addr::remote())
        .and(warp::header("x-forwarded-for"))
        .and(warp::header("x-real-ip"))
        .and(warp::header::headers_cloned())
        .map(|name: String, addr: Option<std::net::SocketAddr>, x_forward_for: String, x_real_ip: String, all_header: HeaderMap|
            {
                println!("{:?}", all_header);
                format!("Hello, {}!\nClient IP: {}\nX-Forwarded-For: {}\nX-Real-IP: {}\n", 
                    name, addr.unwrap().to_string(), x_forward_for, x_real_ip)
            })
        .with(log);		// 加入日志配置

    warp::serve(hello)
        .run(([127, 0, 0, 1], 3030))       // 监听 127.0.0.1
        .await;
}

log 模块的文档也是非常简单,只拥有两个结构体和两个方法。
在这里插入图片描述
我们来访问一下,看看输出的日志是什么样?
在这里插入图片描述
这个日志输出还是相当nice的。我们刚才是使用默认的访问日志记录格式,并生成日志记录。当然了,你也可以使用 custom 方法来定制日志格式和输出。例如:

    let log = warp::log::custom(|info| {
        log::info!(
            target: "MYAPP_LOG",
            "{} {} {}",
            info.method(),
            info.path(),
            info.status(),
        );
    });

此时日志输出如下所示:
在这里插入图片描述
这就是我们定制化之后的输出。不过这还缺少了最重要的东西,那就是日期。因此一般我们会这样使用。

use std::env;
use warp::Filter;

#[tokio::main]
async fn main() {
    env::set_var("MYAPP_LOG", "INFO");
    // 初始化,默认带有时间,时间是带时区的
    pretty_env_logger::try_init_timed_custom_env("MYAPP_LOG").expect("logger init failed!");
    let log = warp::log("MYAPP_LOG");

    // GET /hello/warp => 200 OK with body "Hello, warp!"
    let hello = warp::path!("hello" / String)
        .and(warp::addr::remote())
        .and(warp::header("x-forwarded-for"))
        .and(warp::header("x-real-ip"))
        .map(|name: String, addr: Option<std::net::SocketAddr>, x_forward_for: String, x_real_ip: String|
            {
                format!("Hello, {}!\nClient IP: {}\nX-Forwarded-For: {}\nX-Real-IP: {}\n", 
                    name, addr.unwrap().to_string(), x_forward_for, x_real_ip)
            })
        .with(log);		// 加上日志输出

    warp::serve(hello)
        .run(([127, 0, 0, 1], 3030))       // 监听 127.0.0.1
        .await;
}

在这里插入图片描述
可以看到带有时区的访问时间被输出了。pretty_env_logger 的文档中还提供了其他初始化的方式,我们可以通过查看它的文档来使用其他的初始化方式。
在这里插入图片描述

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

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

相关文章

高性能计算学习教程,从入门到精通

学习高性能计算需要一定的计算机科学和数学基础。以下是一个详细的学习路线&#xff0c;从入门到精通高性能计算的步骤&#xff1a; 阶段一&#xff1a;基础知识学习 计算机科学基础&#xff1a;了解计算机体系结构、操作系统、数据结构和算法。学习编程语言如C/C、Python等。 …

苹果手机没法访问Fildder代理服务怎么办

浏览器输入http://ip:port进入可下载证书页面 异常情况&#xff1a; 浏览器访问http://ip:port后无响应&#xff0c;白屏&#xff0c;或有“无法使用跳转网络”的提示 解决方法&#xff1a; 1. PC重新下载fiddle证书并重启 Fildder4--Tools--Options--HTTPS--Actions--"…

【2022吴恩达机器学习课程视频翻译笔记】2.5无监督学习-part-2

2.5无监督学习-part-2 In the last video, you saw what is unsupervised learning, and one type of unsupervised learning called clustering. Let’s give a slightly more formal definition of unsupervised learning and take a quick look at some other types of uns…

ruoyi-vue版本(三十)Spring Security 安全框架中token的生成与解析

目录 1 使用2 写工具类3 使用工具类 1 使用 1 项目里面添加依赖 <!-- Token生成与解析--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency>2 写工具类 package com.ruoyi.framework.we…

【MQ】消息队列的简介以及常见问题的解决方案

MQ MQ的基本概念 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;实在消息的传输过程中保存消息的容器。多用于分布式系统之间的通信。 分布式系统的两种通信方式&#xff1a;直接调用、借助第三方间接完成 发送者成为生产者&#xff0c;接受者称为消费者…

想要用独立站打造跨境电商品牌吗?这些方法学起来吧!

随着互联网的发展&#xff0c;越来越多的跨境电商卖家开始考虑在独立站上打造自己的品牌。相比于在第三方平台上经营&#xff0c;拥有独立站不仅能够提高品牌认知度和形象&#xff0c;还能够更好地控制产品质量、维护顾客关系&#xff0c;以及获取更多的利润。而要打造一个成功…

CSS盒模型

目录 盒子区域包含块/containing block包含块的确定包含块的影响 行盒/line-boxes行盒的特性vertical-align BFCFCBFC的创建BFC的作用 关于BFC解决margin折叠问题关于设置overflow:auto解决浮动塌陷问题BFC解决塌陷问题的两个条件BFC计算高度规则 盒子区域 浏览器在展示每一个…

N-121基于微信小程序网上书城系统

开发工具&#xff1a;IDEA、微信小程序 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;vue、uniapp 服务端技术&#xff1a;springbootmybatisredis 本系统分微信小程序和管理后台两部分&a…

(23)目标检测算法之YOLOv6 (1)全流程指南:环境安装、模型配置、训练及推理

目标检测算法之YOLOv6 (1)全流程指南&#xff1a;环境安装、模型配置、训练及推理 本文向将介绍 YOLOv6 的整体框架&#xff0c;并提供详细的教程链接。官方论文 ☞ YOLOv6: A Single-Stage Object Detection Framework for Industrial Applicationsv3.0版本论文更新 ☞ YOLOv…

综合评价算法 | Matlab实现基于AHP层次分析法的综合评价算法

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 综合评价算法 | Matlab实现基于AHP层次分析法的综合评价算法 研究内容 AHP的主要特点是通过建立递阶层次结构,把人类的判断转化到若干因 素两两之间重要度的比较上,从而把难于量化的定性判断转化为可操作…

测试四—测试分类

一、按测试对象划分 1.1 界面测试 界面测试&#xff08;简称UI测试)&#xff0c;指按照界面的需求&#xff08;一般是UI设计稿&#xff09;和界面的设计规则&#xff0c;对我们软件界面所展示的全部内容进行测试和检查&#xff0c;一般包括如下内容&#xff1a; 验证界面内容…

解决:在微服务中一个服务访问另一个服务的类或方法出现的问题

我的需求&#xff1a; 我需要在用户模块使用公共模块的service和mapper和实体类&#xff0c;出现以下错误 ​ springboot启动错误如下&#xff1a; 报错结果&#xff1a;需要一个类型为“com.buba.yka.mapper.salesmanMapper”的bean&#xff0c;但找不到该bean Error starti…

接口自动化面试题【思路分享】

文末免费领资料 接口自动化流程怎么做的&#xff0c;框架怎么搭建的&#xff1f; 流程&#xff1a; 1、分析需求&#xff0c;确定测试范围 2、搭建自动化测试环境、准备相关测试数据 3、工具选型&#xff0c;搭建测试框架 4、编写用例 5、执行用例&#xff0c;生成测试报…

记录好项目D19

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个网上商城管理系统 一、系统介绍 需求设计主要参考天猫商城的购物流…

【Linux】—— 进程的环境变量

序言&#xff1a; 在上期我们已经对进程PCB以及进程状态进行了详细的解释说明。今天&#xff0c;我将带领大家学习的是关于进程的环境变量的问题。 目录 &#xff08;一&#xff09;孤儿进程 1、基本介绍 2、代码演示 &#xff08;二&#xff09;环境变量 1、基本概念 2…

使用git管理matlab代码

matlab使用git管理代码 设置 Git 源代码管理 - MATLAB & Simulink - MathWorks 中国 在 R2020b 之前&#xff0c;必须安装命令行 Git 客户端&#xff0c;才能使用 Git 合并 MATLAB 中的分支。有关详细信息&#xff0c;请参阅安装命令行 Git 客户端。 1.在 Git 中注册二进…

Groovy系列三 Java SpringBoot 整合 Groovy

目录 一、概述 一、在Java中使用Groovy&#xff1a; 二、在Groovy中使用Java&#xff1a; 三、几种范式的不同、优缺点 Java调用Groovy的类和方法&#xff1a; Groovy调用Java的类和方法&#xff1a; 使用GroovyShell执行Groovy脚本&#xff1a; 使用GroovyClassLoader加…

4.0ORBSLAM3之局部建图线程概述

1.简介 局部建图线程是ORBSLAM3的核心线程之一&#xff0c;在初始化SLAM系统时被创建和启动&#xff0c;主要作用是为跟踪线程(跟踪局部地图)以及回环检测线程(回环检测)服务&#xff0c;并进行局部地图优化以及时消除轨迹的累计误差。局部建图线程主要维护一个由共视图Covisi…

JSP网上订餐管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 网上订餐管理系统是一套完善的web设计系统&#xff0c;对理解JSP java SERLVET mvc编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&a…

java压测工具 Jmeter初使用

一. 下载及安装教程 1. 有博主总结的很好&#xff0c;这里直接放传送门&#xff1a; 【Jmeter】win 10 / win 11&#xff1a;Jmeter 下载、安装、汉化、新机迁移、版本更新&#xff08;Jmeter 4 以上版本均适用&#xff09; 2. Jmeter 自定义创建桌面快捷方式 3. JMeter插件…