非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程

简介: UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。

UniHttp是一个声明式的HTTP接口对接框架,它能够帮助开发者以极快的方式完成对一个第三方HTTP接口的对接和使用。以下是对UniHttp的详细使用说明及示例:

一、UniHttp简介

UniHttp框架注重于如何保持高内聚和可读性高的代码情况下与快速第三方渠道接口进行对接和集成。与其说是对接的HTTP接口,不如说是对接的第三方渠道。UniHttp可支持自定义接口渠道方HttpAPI注解以及一些自定义的对接和交互行为,为此扩展了发送、响应和反序列化一个HTTP请求的各种生命周期钩子,开发者可自行去扩展实现。

二、UniHttp的使用

1. 引入依赖

首先,需要在项目的pom.xml文件中引入UniHttp的依赖:

<dependency>

   <groupId>io.github.burukeyou</groupId>

   <artifactId>uniapi-http</artifactId>

   <version>0.0.4</version>

</dependency>

2. 创建接口并标记

创建一个接口,并在接口上标记@HttpApi注解,指定请求的域名URL。然后,在方法上配置对接的接口,并使用各种@Par后缀的注解来指定请求的参数。

例如:

@HttpApi(url = "http://localhost:7001/test")

public interface TestHttpApi {

   @GetHttpInterface("/getUser")

   HttpResponse<String> getUser(@QueryPar("name") String param, @HeaderPar("userId") Integer id);

 

   @PostHttpInterface("/addUser")

   HttpResponse<String> addUser(@BodyJsonPar VideoDTO req);

}

在上述示例中,@GetHttpInterface@PostHttpInterface分别用于配置GET和POST请求。@QueryPar表示将参数值放到HTTP请求的查询参数内,@HeaderPar表示将参数值放到HTTP请求的请求头里,@BodyJsonPar表示将参数值放到HTTP请求body内,并且content-type是application/json。

3. 声明定义的HttpAPI的包扫描路径

在Spring的配置类上使用@UniAPIScan注解标记定义的@HttpAPI的包扫描路径。这样,UniHttp会自动为标记了@HttpApi接口的生成代理对象,并将其注入到Spring容器中。之后,只需要像使用Spring的其他bean一样,通过依赖注入来使用这些接口。

例如:

@UniAPIScan("com.hdx.contractor.util")

@SpringBootApplication

public class DemoApplication {

   public static void main(String[] args) {

       SpringApplication.run(DemoApplication.class, args);

   }

}

4. 依赖注入并使用

通过依赖注入的方式,将创建的接口注入到需要使用的地方,并调用其方法。

例如:

@Service

public class UserAppService {

   @Autowired

   private TestHttpApi testHttpApi;

 

   public void doSomething() {

       HttpResponse<String> response = testHttpApi.getUser("test", 1);

       // 处理响应结果

   }

}

三、UniHttp的注解说明

  1. @HttpApi:用于标记接口,指定请求的域名URL,也可指定自定义的HTTP代理逻辑等。
  2. @HttpInterface及其变种(如@GetHttpInterface、@PostHttpInterface等):用于配置一个接口的参数,包括请求方式、请求路径、请求头、请求cookie、请求查询参数等。
  3. @Par后缀的注解(如@QueryPar、@HeaderPar、@BodyJsonPar等):用于方法参数上,指定在发送请求时将参数值放到HTTP请求体的哪部分上。

四、示例详解

以下是一个完整的示例,展示了如何使用UniHttp对接一个第三方HTTP接口:

// 引入必要的依赖和注解

import com.burukeyou.uniapi.http.annotation.HttpApi;

import com.burukeyou.uniapi.http.annotation.param.*;

import com.burukeyou.uniapi.http.annotation.request.GetHttpInterface;

import com.burukeyou.uniapi.http.annotation.request.PostHttpInterface;

import com.burukeyou.uniapi.http.core.response.HttpResponse;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.annotation.Bean;

import org.springframework.stereotype.Service;

 

// 声明HTTP接口

@HttpApi(url = "http://localhost:7001/test")

public interface TestHttpApi {

   @GetHttpInterface("/getUser")

   HttpResponse<String> getUser(@QueryPar("name") String param, @HeaderPar("userId") Integer id);

 

   @PostHttpInterface("/addUser")

   HttpResponse<String> addUser(@BodyJsonPar UserDTO req);

}

 

// 用户数据传输对象

public class UserDTO {

   private String name;

   private Integer age;

   // getter和setter方法

}

 

// Spring Boot应用主类

@SpringBootApplication

@UniAPIScan("com.example.demo.api") // 指定@HttpApi接口所在的包路径

public class DemoApplication {

   public static void main(String[] args) {

       SpringApplication.run(DemoApplication.class, args);

   }

}

 

// 服务类,用于调用HTTP接口

@Service

public class UserService {

   @Autowired

   private TestHttpApi testHttpApi;

 

   public void getUserAndAddUser() {

       // 调用GET接口

       HttpResponse<String> getUserResponse = testHttpApi.getUser("John", 123);

       System.out.println("GetUser Response: " + getUserResponse.getBody());

 

       // 准备POST请求的数据

       UserDTO userDTO = new UserDTO();

       userDTO.setName("Jane");

       userDTO.setAge(25);

 

       // 调用POST接口

       HttpResponse<String> addUserResponse = testHttpApi.addUser(userDTO);

       System.out.println("AddUser Response: " + addUserResponse.getBody());

   }

}

在上面的示例中,我们首先定义了一个TestHttpApi接口,用于对接第三方的HTTP接口。然后,在Spring Boot应用主类上使用了@UniAPIScan注解来指定@HttpApi接口所在的包路径。最后,在UserService类中通过依赖注入的方式注入了TestHttpApi接口,并调用了其方法。

通过以上步骤,就可以使用UniHttp框架快速对接和使用第三方HTTP接口了。

五、高级功能与自定义配置

1. 自定义HTTP代理逻辑

UniHttp允许开发者通过实现HttpProxy接口来自定义HTTP请求的处理逻辑。这包括在发送请求之前和接收响应之后执行自定义操作。

public class CustomHttpProxy implements HttpProxy {

   @Override

   public HttpRequestWrapper beforeSend(HttpRequestWrapper requestWrapper) {

       // 在发送请求之前修改请求,例如添加自定义请求头

       requestWrapper.addHeader("Custom-Header", "HeaderValue");

       return requestWrapper;

   }

 

   @Override

   public <T> HttpResponse<T> afterReceive(HttpResponse<T> response, HttpRequestWrapper requestWrapper) {

       // 在接收响应之后处理响应,例如记录日志或修改响应内容

       System.out.println("Received response: " + response.getBody());

       return response;

   }

}

然后,在@HttpApi注解中指定这个自定义代理:

@HttpApi(url = "http://localhost:7001/test", proxy = CustomHttpProxy.class)

public interface TestHttpApi {

   // ... 接口方法

}

2. 配置全局请求参数

有时,你可能需要在所有请求中都包含某些全局参数,例如API密钥或用户令牌。这可以通过实现GlobalRequestParamProvider接口来实现。

@Component

public class GlobalRequestParamProviderImpl implements GlobalRequestParamProvider {

   @Override

   public Map<String, Object> provideParams() {

       Map<String, Object> params = new HashMap<>();

       params.put("apiKey", "your-api-key");

       return params;

   }

}

UniHttp会自动将这个全局参数添加到所有HTTP请求中。

3. 自定义错误处理

UniHttp允许你通过实现HttpErrorHandler接口来自定义错误处理逻辑。这包括处理HTTP状态码错误和请求/响应解析错误。

@Component

public class CustomHttpErrorHandler implements HttpErrorHandler {

   @Override

   public void handleError(HttpRequestWrapper requestWrapper, Throwable throwable) {

       // 自定义错误处理逻辑,例如记录日志或抛出异常

       System.err.println("Error occurred: " + throwable.getMessage());

   }

}

4. 配置连接池和超时

UniHttp使用Apache HttpClient作为底层的HTTP客户端库,因此你可以通过配置Apache HttpClient的HttpClientBuilder来自定义连接池和超时设置。

@Bean

public CloseableHttpClient httpClient() {

   HttpClientBuilder builder = HttpClients.custom();

   // 配置连接池和超时

   builder.setMaxConnTotal(100);

   builder.setDefaultRequestConfig(RequestConfig.custom()

           .setConnectTimeout(5000)

           .setSocketTimeout(5000)

           .build());

   // ... 其他配置

   return builder.build();

}

然后,在UniHttp的配置类中指定这个CloseableHttpClient实例:

@Configuration

public class UniHttpConfig {

   @Autowired

   private CloseableHttpClient httpClient;

 

   @Bean

   public UniHttpConfigurer uniHttpConfigurer() {

       return new UniHttpConfigurer() {

           @Override

           public void configure(UniHttpProperties properties) {

               properties.setHttpClient(httpClient);

               // 其他配置

           }

       };

   }

}

六、总结

UniHttp是一个强大的HTTP接口对接框架,它提供了声明式的接口定义方式、丰富的注解支持、自定义代理逻辑、全局请求参数、自定义错误处理和连接池/超时配置等高级功能。通过UniHttp,开发者可以快速地对接和使用第三方HTTP接口,同时保持代码的高内聚和可读性。无论是简单的GET/POST请求还是复杂的自定义请求处理,UniHttp都能提供灵活且强大的支持。

相关文章
|
7天前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
32 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
7天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
35 5
|
1月前
|
并行计算 算法 Java
Java中的Fork/Join框架详解
Fork/Join框架是Java并行计算的强大工具,尤其适用于需要将任务分解为子任务的场景。通过正确使用Fork/Join框架,可以显著提升应用程序的性能和响应速度。在实际应用中,应结合具体需求选择合适的任务拆分策略,以最大化并行计算的效率。
51 23
|
2月前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
53 3
|
2月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
2月前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
234 2
|
2月前
|
数据采集 JSON Java
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
2月前
|
算法 Java 调度
java并发编程中Monitor里的waitSet和EntryList都是做什么的
在Java并发编程中,Monitor内部包含两个重要队列:等待集(Wait Set)和入口列表(Entry List)。Wait Set用于线程的条件等待和协作,线程调用`wait()`后进入此集合,通过`notify()`或`notifyAll()`唤醒。Entry List则管理锁的竞争,未能获取锁的线程在此排队,等待锁释放后重新竞争。理解两者区别有助于设计高效的多线程程序。 - **Wait Set**:线程调用`wait()`后进入,等待条件满足被唤醒,需重新竞争锁。 - **Entry List**:多个线程竞争锁时,未获锁的线程在此排队,等待锁释放后获取锁继续执行。
87 12
|
2月前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
60 6
|
2月前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####