easy-http是一个完全基于注解和接口的http客户端,为简化开发、提高效率而生。
<dependency> <groupId>com.github.firelcw</groupId> <artifactId>easy-http</artifactId> <version>1.3.0</version> </dependency>
spring-boot版本移步: easy-http-boot-starter
首先定义一个接口:
public interface BookHttpService { @Get("/books/{id}") ApiResult<Book> getBookById(@Var("id") String id); }
这是一个最简单的查询接口,然后通过接口构建执行
BookHttpService bookHttpService = EasyHttp.builder() .url("127.0.0.1:8888") .build(BookHttpService.class); ApiResult<Book> bookRet = bookHttpService.getBookById("166895"); System.out.println(bookRet.getData().getName());
像类似@GET的注解还有@Post、@Put、@Delete,@Post、@Put可指定content-type,默认是application/json。
路径变量注解,用于替换路径上的变量,路径变量只能是简单参数类型,八大基本类型加String。
@Get("/books/{id}") ApiResult<Book> getBookById(@Var("id") String id); @Get("/books?author={author}") ApiResult<Book> getBookById(@Var("author") String author);
被注解的参数是复杂类型,是参数的model或者map,因为它生成的是查询参数,会拼接到路径后面。缺省默认为查询参数。
@Get("/books") ApiResult<List<Book>> listBooksByAuthor(@Query Map<String, String> params); // 和上面效果一样 @Get("/books") ApiResult<List<Book>> listBooksByAuthor(Map<String, String> params);
body参数,被注解的参数会根据编码器处理放到请求body里面。
@Post("/books") void addBook(@Body Book book);
被注解的参数为请求头。
@Post("/books") ApiResult<Void> addBook(@Body Book book, @Headers Map<String, String> headers);
编码器: 将参数对象解析成http的相关请求参数
编写自定义编码器类CustomEncoder实现Encoder接口
CustomEncoder
Encoder
public class CustomEncoder implements Encoder { /** * 将对象转化成成Map<String,String> 用于编码@Query和@Headers * @param object 待编码对象 * @return map */ @Override public Map<String, String> encodeMap(Object object) { return null; } /** * 将对象转化成string,用于编码 @Body注解的对象(默认是解析成json字符串) * @param object * @return string */ @Override public String encodeString(Object object) { return null; } }
在构建对象是加入CustomEncoder
BookHttpService bookHttpService = EasyHttp.builder() .url("127.0.0.1:8888") .encoder(new CustomEncoder()) .build(BookHttpService.class);
将返回体解析成对象
编写自定义编码器类CustomDecoder实现Decoder接口
CustomDecoder
Decoder
public class CustomDecoder implements Decoder { /** * 响应解码(默认使用fastjon解码) * @param response 响应参数 * @param type 返回值类型 * @return Object */ @Override public Object decode(HttpResponse response, Type type) { return null; } }
在构建对象是加入CustomDecoder
BookHttpService bookHttpService = EasyHttp.builder() .url("127.0.0.1:8888") .encoder(new CustomEncoder()) .decoder(new CustomDecoder()) .build(BookHttpService.class);
在请求发出前和请求响应后进行拦截
编写自定义编码器类ResultInterceptor实现HttpInterceptor接口
ResultInterceptor
HttpInterceptor
public class ResultInterceptor implements HttpInterceptor { @Override public boolean preHandle(HttpRequest request, HttpRequestConfig config) { return true; } @Override public void postHandle(HttpRequest request, HttpResponse response) { if (!response.isSuccess()) { throw new EasyHttpException("请求错误~"); } if (StringUtils.isBlank(response.getBody())) { return; } JSONObject retJson = JSON.parseObject(response.getBody()); // 假设业务code:200 为操作成功 if (retJson.getInteger("code") == 200) { // 覆盖包含公共信息的json response.setBody(retJson.getString("data")); } } @Override public int order() { return 4; } }
preHandle 请求前拦截,返回true则通过,反之则被拦截。postHandle 响应后拦截。order定义拦截器的顺序,值越小,越靠前。这里ResultInterceptor对统一的返回作了处理。不仅判断了请求和业务是否成功,并且还统一包装了返回体,去掉了通过返回部分,具体根据业务定制。
preHandle
postHandle
order
在构建对象是加入拦截器列表
BookHttpService bookHttpService = EasyHttp.builder() .url("127.0.0.1:8888") .encoder(new CustomEncoder()) .decoder(new CustomDecoder()) .withInterceptor(new ResultInterceptor()) .withInterceptor(new TimeInterceptor()) .build(BookHttpService.class);
原文链接:https://www.cnblogs.com/liaochongwei/p/13450970.html