Forest Forest
💒 首页
  • v1.5.30
  • v1.5.28
  • 🎄 ForestX
🌰 案例
💖 支持
🛫 更新记录
🧢 开发团队
⚒️ 参与贡献
  • MaxKey - 业界领先的身份管理和认证产品 (opens new window)
  • Snowy - 国内首个国密前后端分离快速开发平台 (opens new window)
  • Eoapi - 一个开源、可拓展的 API 工具平台 (opens new window)
  • Gitee (opens new window)
  • Github (opens new window)
💒 首页
  • v1.5.30
  • v1.5.28
  • 🎄 ForestX
🌰 案例
💖 支持
🛫 更新记录
🧢 开发团队
⚒️ 参与贡献
  • MaxKey - 业界领先的身份管理和认证产品 (opens new window)
  • Snowy - 国内首个国密前后端分离快速开发平台 (opens new window)
  • Eoapi - 一个开源、可拓展的 API 工具平台 (opens new window)
  • Gitee (opens new window)
  • Github (opens new window)
  • 序言

    • 🎁 新手介绍
    • 📖 文档
    • 🌰 使用案例
    • 🕵️‍ 关于作者
    • 👨‍🎓 贡献者列表
  • 入门

    • 🎬 安装配置说明
    • 🏹 Springboot环境安装
    • 📐 Springboot环境配置
    • 🎯 Springboot环境使用
    • 🏹 Spring环境安装
    • 📐 Spring环境配置
    • 🎯 Spring环境使用
    • 🏹 原生Java环境安装
    • 📐 原生Java环境配置
    • 🎯 原生Java环境使用
    • 🧬 编程式接口
  • 配置项

    • 👜 Springboot环境配置项
    • 👝 Spring环境配置项
    • 🎒 原生Java环境配置项
    • 📚 配置优先级/作用域
  • 声明式接口

    • 🧱 构建接口
    • 🍀 请求方法
    • 🚚 请求地址
      • 设置URL
      • URL结构
      • 根地址
        • @Address 注解
        • 动态根地址
    • 🎈 URL 参数
    • 🍭 请求头
    • 👔 请求体
    • 🍮 后端框架
    • 🧁 接口注解
    • 📬 接收数据
    • 🍛 数据转换
    • 🍓 成功/失败条件
    • 🍌 重试机制
    • 🥂 重定向
    • 🍔 Gzip解压
    • 🎂 日志管理
    • ⚽ 回调函数
    • 🍟 异步请求
    • 🛡️ HTTPS
    • 🍪 使用Cookie
    • 🛸 使用代理
    • 🍉 上传下载
    • 🚑 异常处理
  • 编程式接口

    • 请求API

      • 🚀 请求对象
      • 🚢 请求属性
      • ✨ 执行请求
      • 🎊 后端框架
      • 🎪 请求类型
      • 🔮 请求地址
      • 🧀 URL 参数
      • 🚅 请求头
      • 🚋 请求体
      • ⚓ 回调函数
      • 🚁 异步请求
      • 🥯 Cookie
      • 🍜 成功/失败条件
      • 🌶️ 重试机制
      • ⛵ 重定向
      • 🛰️ 请求代理
    • 响应API

      • 🌠 响应对象
      • ✒️ 读取数据
      • 🦋 响应状态码
      • 🏥 响应错误处理
      • 🎧 响应头
      • 🥞 Cookie
  • 模板表达式

    • 🍬 Hello World
    • 🍹 配置属性引用
    • 🍖 变量引用
    • 🥃 动态变量绑定
    • 🥗 参数序号引用
    • 🍍 引用对象属性
    • 🥝 调用对象方法
  • 高级特性

    • 🥪 拦截器
    • 🍏 自定义注解
    • 🍇 组合注解
    • 🥑 自定义转换器
  • v1.5.28文档
  • 声明式接口
公子骏
2022-07-01
目录

🚚 请求地址

HTTP请求可以没有请求头、请求体,但一定会有请求地址,即URL,以及很多请求的参数都是直接绑定在URL的Query部分上

# 设置URL

基本URL设置方法就如 《简单请求》 的例子所示,只要在url属性中填入完整的请求地址即可。

除此之外,也可以通过 @Var 注解修饰的参数从外部动态传入URL:

/**
 * 整个完整的URL都通过参数传入
 * {0}代表引用第一个参数
 */
@Get("{0}")
String send1(String myURL);

/**
 * 整个完整的URL都通过 @Var 注解修饰的参数动态传入
 */
@Get("{myURL}")
String send2(@Var("myURL") String myURL);

/**
 * 通过参数转入的值作为URL的一部分
 */
@Get("http://{myURL}/abc")
String send3(@Var("myURL") String myURL);

/**
 * 参数转入的值可以作为URL的任意一部分
 */
@Get("http://localhost:8080/test/{myURL}?a=1&b=2")
String send4(@Var("myURL") String myURL);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# URL结构

再继续介绍之后的Forest URL相关内容之前,我认为有必要先讲解下URL的标准结构 (已经对此非常了解的小伙伴可以跳过此节)

一个标准的URL一般会包含以下几个部分:

  • 协议: 如URL的协议部分为http ,就代表请求使用的是HTTP协议
  • 域名: 如URL的域名部分为baidu.com,就代表请求域名地址为baidu.com,IP地址和主机名也可以当作域名一样使用
  • 端口号: 跟在域名后面的是端口,域名和端口之间使用:作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,HTTP协议请求将采用默认端口80,HTTPS则用默认端口443
  • 路径地址: 路径地址是从域名后的第一个/开始,一直到?为止的部分,如果没有?,则是从域名后的最后一个/开始到#为止的部分,如果没有?和#,那么从域名后的第一个/开始到结束,都是路径地址部分
  • 查询参数: 从?开始到#为止之间的部分为查询参数部分,又称搜索部分、查询部分
  • 锚: 从#开始到最后,都是锚部分
url

# 根地址

我们都知道,一个URL地址包含协议、站点地址(域名/IP地址/主机名)、端口号、路径地址、查询参数等几个部分。

而协议、站点地址(域名/IP地址/主机名)、端口号这三部分称为根地址。

但如果代码中大量URL接口都来自同一个站点,那就会存在两大重复的域名或IP地址,如果它们都以字符串形式散落在各个Forest请求接口方法的URL属性中,那就会变得难以维护。

# @Address 注解

Forest 从1.5.3版本开始提供了 @Address 注解,帮助您将URL的地址部分提取出来,方便管理

// 通过 @Address 注解绑定根地址
// host 绑定到第一个参数, port 绑定到第二个参数
@Post("/data")
@Address(host = "{0}", port = "{1}")
ForestRequest<String> sendHostPort(String host, int port);

// 若调用 sendHostPort("192.168.0.2", 8080);
// 则最终产生URL:
// http://192.168.0.2:8080/data
1
2
3
4
5
6
7
8
9

@Address 注解可以绑定到接口类上,根地址绑定返回就扩展到整个接口下的所有方法

// 整个接口下的所有方法请求都默认绑定该根地址
@Address(host = "127.0.0.1", port = "8080")
public interface MyClient {

    // 绑定接口上的默认根地址
    // 最终URL: http://127.0.0.1:8080/data1
    @Post("/data1")
    ForestRequest<String> sendData1();

    // 绑定接口上的默认根地址
    // 最终URL: http://127.0.0.1:8080/data2
    @Post("/data2")
    ForestRequest<String> sendData2();

    // 使用方法上的根地址
    // 最终URL: http://192.168.0.1:7000/data3
    @Post("/data3")
    @Address(host = "192.168.0.1", port = "7000")
    ForestRequest<String> sendData3();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 动态根地址

以上的方法虽然可以方便管理和批量配置多个请求的根地址,但如果想要实时动态地变更根地址就很困难

比如:我想每次发送请求的时候,动态地从3个IP地址中随机选取一个作为根地址,该怎么做呢?

Forest 提供了地址来源接口,即AddressSource接口来帮您实现该功能

// 实现 AddressSource 接口
public class MyAddressSource implements AddressSource {

    @Override
    public ForestAddress getAddress(ForestRequest request) {
        // 定义 3 个 IP 地址
        String[] ipArray = new String[] {
                "192.168.0.1",
                "192.168.0.2",
                "192.168.0.3",
        };
        // 随机选出其中一个
        Random random = new Random();
        int i = random.nextInt(3);
        String ip = ipArray[i];
        // 返回 Forest 地址对象
        return new ForestAddress(ip, 80);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

绑定自定义的AddressSource接口实现类

// 也是通过 @Address 注解来绑定动态地址来源
// 每次调用该方法,都可能是不同的根地址
@Post("/data")
@Address(source = MyAddressSource.class)
ForestRequest<String> sendData();
1
2
3
4
5

若连续调用多次sendData(),则每次请求的URL根地址都可能会不同

myClient.sendData(); // 第一次调用, URL: http://192.168.0.2/data
myClient.sendData(); // 第二次调用, URL: http://192.168.0.2/data
myClient.sendData(); // 第三次调用, URL: http://192.168.0.1/data
myClient.sendData(); // 第四次调用, URL: http://192.168.0.3/data
myClient.sendData(); // 第五次调用, URL: http://192.168.0.1/data
1
2
3
4
5
帮助我们改善此文档 (opens new window)
上次更新: 2023/03/07, 12:59:48
🍀 请求方法
🎈 URL 参数

← 🍀 请求方法 🎈 URL 参数→

Theme by Vdoing | Copyright © 2016-2023 公子骏 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式