Duang!Duang!Duang!直击痛点的一款 HTTP 客户端框架(Java),墙裂推荐!(2)

简介: Duang!Duang!Duang!直击痛点的一款 HTTP 客户端框架(Java),墙裂推荐!

前端部分:


通过RPC方式去发送HTTP请求, 方便解耦

支持GET, HEAD, POST等所有请求方法

支持Spring和Springboot集成

JSON字符串到Java对象的自动化解析

XML文本到Java对象的自动化解析

支持灵活的模板表达式

支持拦截器处理请求的各个生命周期

支持自定义注解

后端部分:


支持OkHttp

支持Httpclient

Forest 容易上手,不需要调用HTTP底层接口,而是像 Dubbo 那样的 RPC 框架一样,只需要定义接口、调用接口即可。几分钟内就可完成请求的定义、发送、接收响应、数据解析、错误处理、日志打印等过程。


配置轻量,遵循约定优于配置的原则,只需在需要的时候进行配置,不配置也不会影响Forest请求的正常调用。


简单优雅,将 HTTP 请求细节封装成 Java 接口 + 注解的形式,不必再关心发送 HTTP 请求的具体过程。使得 HTTP 请求信息与业务代码解耦,方便管理大量 HTTP 的 URL、Header、Body 等信息。


扩展灵活,允许自定义拦截器、甚至是自定义注解,以此来扩展Forest的能力。


Forest 不需要我们编写具体的 HTTP 调用过程,只需要定义一个接口,然后通过 Forest 注解将 HTTP 请求的信息添加到接口的方法上即可。请求发送方通过调用定义的接口就能自动发送请求和接受请求的响应。


Forest 之所以能做到这样,是因为它将定义好的接口通过动态代理的方式生成了一个具体的实现类,然后组织、验证 HTTP 请求信息,绑定动态数据,转换数据形式,SSL 验证签名,调用后端 HTTP API执行实际请求,等待响应,失败重试,转换响应数据到 Java 类型等脏活累活都由这动态代理的实现类给包了。


废话就不再多说,直接开始实战。


第一步,添加 Maven 依赖。


<dependency>

   <groupId>com.dtflys.forest</groupId>

   <artifactId>forest-core</artifactId>

   <version>1.5.1</version>

</dependency>



第二步,构建 HTTP 请求。


在 Forest 中,所有的 HTTP 请求信息都要绑定到某一个接口的方法上,不需要编写具体的代码去发送请求。请求发送方通过调用事先定义好 HTTP 请求信息的接口方法。


public interface ForRestClient {

   @Request(

           url = "http://httpbin.org/post",

           type = "POST"

   )

   String simplePost(@Body("name") String name);

}



通过 @Post 注解,将上面的ForRestClient接口中的 simplePost() 方法绑定了一个 HTTP 请求,使用 POST 方式,可以使用@Body注解修饰参数的方式,将传入参数的数据绑定到 HTTP 请求体中。然后将请求响应的数据以String的方式返回给调用者。


第三步,调用接口。


public class ForRestDemo {
    public static void main(String[] args) {
        // 实例化Forest配置对象
        ForestConfiguration configuration = ForestConfiguration.configuration();
        configuration.setBackendName("httpclient");
        // 通过Forest配置对象实例化Forest请求接口
        ForRestClient myClient = configuration.createInstance(ForRestClient.class);
        // 调用Forest请求接口,并获取响应返回结果
        String result = myClient.simplePost("二哥");
        System.out.println(result);
    }
}



ForestConfiguration为 Forest 的全局配置对象类,所有的 Forest 的全局基本配置信息由此类进行管理。


可以来看一下运行后的日志信息:


{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "name": "\u4e8c\u54e5"
  }, 
  "headers": {
    "Content-Length": "23", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Apache-HttpClient/4.5.2 (Java/11.0.8)", 
    "X-Amzn-Trace-Id": "Root=1-60b533aa-58b41e4967803d99593c53a0"
  }, 
  "json": null, 
  "origin": "161.81.21.32", 
  "url": "http://httpbin.org/post"
}


此时,一个简单的 Forest 上手小栗子就跑通了。


如果是 Spring Boot 项目的话,就不需要 ForestConfiguration 了,只需要在启动类或者配置类上添加 @ForestScan 注解就可以了。


@SpringBootApplication
@Configuration
@ForestScan(basePackages = "com.yoursite.client")
public class MyApp {
 ...
}



Forest 除了支持GET和POST,也支持其他几种 HTTP 请求方式,比如PUT、HEAD、 OPTIONS、DELETE。只需要在构建接口的时候使用对应的注解就可以了,比如说 PUT:


// PUT请求

@Put("http://localhost:8080/hello")

String simplePut();



在POST和PUT请求方法中,通常使用 HTTP 请求体进行数据传输,在 Forest 中,可以使用 @Body、@JSONBody、@XMLBody 等多种方式设置请求体数据。


/**

* 直接修饰一个JSON字符串

*/

@Post("http://localhost:8080/hello/user")

String helloUser(@JSONBody String userJson);



Forest 请求会自动将响应的返回数据反序列化成对应的数据类型,分两步走。


第一步:定义dataType属性


dataType属性指定了该请求响应返回的数据类型,可选的数据类型有三种: text, json, xml,默认为 text。


/**
 * dataType为json或xml时,Forest会进行相应的反序列化
 */
@Request(
    url = "http://localhost:8080/text/data",
    dataType = "json"
)
Map getData();



第二步:指定反序列化的目标类型


反序列化需要一个目标类型,而该类型其实就是方法的返回值类型,如返回值为String就会反序列成String字符串,返回值为Map就会反序列化成一个HashMap对象,也可以指定为自定义的Class类型。


如果有这样一个 User 类:


public class User {
    private String username;
    private String score;
    // Setter和Getter ...
}



返回的数据为 JSON 字符串:


{"username":  "Foo", "score":  "82"}

1

那请求接口就应该定义成这样:


/**

* dataType属性指明了返回的数据类型为JSON

*/

@Get(

   url = "http://localhost:8080/user?id=${0}",

   dataType = "json"

)

User getUser(Integer id)



另外,大家需要了解一下 Gzip,它是现在一种流行的文件压缩算法,有相当广泛的应用范围。尤其是当Gzip用来压缩存文本文件的时候效果尤为明显,大概能减少70%以上的文件大小。很多 HTTP 服务器都支持 Gzip,比如 Tomcat,经过这些服务压缩过的数据可以降低网络传输的流量,提高客户端的响应速度。


Forest从1.5.2-BETA版本开始支持Gzip的解压,其解压的方式也很简单,在方法或接口类上加上 @DecompressGzip 注解即可。


/**

* 为请求方法添加Gzip解压能力

*/

@Get("/transaction")

@DecompressGzip

String transaction(String infno);



更重要的一点是,Forest 可以通过设置@Request注解的async属性为true来实现异步请求。


@Request(
        url = "http://localhost:8080/hello/user?username=${0}",
        async = true,
        headers = {"Accept:text/plain"}
)
void asyncGet(String username, OnSuccess<String> onSuccess);


异步请求时,通过 OnSuccess<T> 回调函数来接受响应数据,而不是通过接口方法的返回值,所以这里的返回值类型一般会定义为void。


调用该接口方法时,可以通过下面的方式:


myClient.send("foo", (String resText, ForestRequest request, ForestResponse response) -> {
        // 成功响应回调
        System.out.println(resText);    
    },
    (ForestRuntimeException ex, ForestRequest request, ForestResponse response) -> {
        // 异常回调
        System.out.println(ex.getMessage());
    });



除了上面提到的这些功能,Forset 还支持更高级的用法:


HTTPS

文件上传下载

拦截器

使用代理

自定义注解

大家可以去看一下 Forset 的官方文档,然后在本地实践一下,还是能学到不少知识的,尤其是 HTTPS 和文件上传下载这块,只需要简单的配置就能完成,我个人感觉还是挺值得去学习和借鉴的。


开源精神难能可贵,好的开源需要大家的添砖加瓦和支持。希望这篇文章能给大家在选择 HTTP 客户端框架时带来一个新的选择,对,就是 Forest。


这篇文章不仅介绍了 Forest 这个轻量级的 HTTP 客户端框架,还回顾了它的底层实现:HttpClient 和 OkHttp,希望能对大家有所帮助。


GitHub 上星标 115k+ 的 Java 教程


作为 CSDN 上 Java 领域的优质创作者(拥有 27 万粉的男人),二哥一直在想,怎么帮助大家更好地学习 Java,于是我连载了通俗易懂的《教妹学Java》,目前已更新了 36 篇。


与此同时,为了帮助大家更好的入门 Java,我花了一周的时间整理了一份 GitHub 上星标 115k+ 的 Java 教程。



里面涵盖了 Java 所有的知识点,包括 Java 语法、Java 集合框架、Java IO、Java 并发编程和 Java 虚拟机,内容不多,只讲重点。很多读者看完后都来私信我,说这本 PDF 的质量真高:GitHub 上星标 115k+ 的 Java 教程下载地址(点击)


另附:纯 Java 版的 LeetCode 刷题笔记,对算法薄弱和需要提高算法的同学很有帮助。


最后,希望大家都能在 Java 这条路上越走越远,拿到更好的 offer,走上逆袭之路。


我是二哥呀,我们下期见~


相关文章
|
2月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
15天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
34 3
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
50 4
|
2月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
81 2
|
2月前
|
前端开发 Java 数据库连接
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
159 1
|
2月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
61 0
|
4月前
|
监控 安全 搜索推荐
设置 HTTPS 协议以确保数据传输的安全性
设置 HTTPS 协议以确保数据传输的安全性
|
22天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
85 1
|
2月前
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
79 11