Forest,这款轻量级 HTTP 客户端 API 框架很强( 七 )

send(@DataVariable("username") String username);调用和处理的过程如下:
ForestResponse<String> response = myClient.send("foo");// 用isError方法判断请求是否失败, 比如404, 500等情况if (response.isError()) {int status = response.getStatusCode(); // 获取请求响应状态码String content = response.getContent(); // 获取请求的响应内容String result = response.getResult(); // 获取方法返回类型对应的最终数据结果}(4)拦截器方式
若要批量处理各种不同请求的异常情况,可以定义一个拦截器, 并在拦截器的onError方法中处理异常,示例代码如下:
public class ErrorInterceptor implements Interceptor<String> {// ... ...@Overridepublic void onError(ForestRuntimeException ex, ForestRequest request, ForestResponse response) {int status = response.getStatusCode(); // 获取请求响应状态码String content = response.getContent(); // 获取请求的响应内容Object result = response.getResult(); // 获取方法返回类型对应的返回数据结果}}4.2.3 拦截器(1)构建拦截器
实现com.dtflys.forest.interceptor.Interceptor接口
public class SimpleInterceptor implements Interceptor<String> {private final static Logger log = LoggerFactory.getLogger(SimpleInterceptor.class);/*** 该方法在被调用时,并在beforeExecute前被调用* @Param request Forest请求对象* @Param args 方法被调用时传入的参数数组*/@Overridepublic void onInvokeMethod(ForestRequest request, ForestMethod method, Object[] args) {log.info("on invoke method");// addAttribute作用是添加和Request以及该拦截器绑定的属性addAttribute(request, "A", "value1");addAttribute(request, "B", "value2");}/*** 该方法在请求发送之前被调用, 若返回false则不会继续发送请求* @Param request Forest请求对象*/@Overridepublic boolean beforeExecute(ForestRequest request) {log.info("invoke Simple beforeExecute");// 执行在发送请求之前处理的代码request.addHeader("accessToken", "11111111");// 添加Headerrequest.addQuery("username", "foo");// 添加URL的Query参数return true;// 继续执行请求返回true}/*** 该方法在请求成功响应时被调用*/@Overridepublic void onSuccess(String data, ForestRequest request, ForestResponse response) {log.info("invoke Simple onSuccess");// 执行成功接收响应后处理的代码int status = response.getStatusCode(); // 获取请求响应状态码String content = response.getContent(); // 获取请求的响应内容String result = data;// data参数是方法返回类型对应的返回数据结果result = response.getResult(); // getResult()也可以获取返回的数据结果response.setResult("修改后的结果: " + result);// 可以修改请求响应的返回数据结果// 使用getAttributeAsString取出属性,这里只能取到与该Request对象,以及该拦截器绑定的属性String attrValue1 = getAttributeAsString(request, "A1");}/*** 该方法在请求发送失败时被调用*/@Overridepublic void onError(ForestRuntimeException ex, ForestRequest request, ForestResponse response) {log.info("invoke Simple onError");// 执行发送请求失败后处理的代码int status = response.getStatusCode(); // 获取请求响应状态码String content = response.getContent(); // 获取请求的响应内容String result = response.getResult(); // 获取方法返回类型对应的返回数据结果}/*** 该方法在请求发送之后被调用*/@Overridepublic void afterExecute(ForestRequest request, ForestResponse response) {log.info("invoke Simple afterExecute");// 执行在发送请求之后处理的代码int status = response.getStatusCode();// 获取请求响应状态码String content = response.getContent();// 获取请求的响应内容String result = response.getResult();// 获取方法返回类型对应的最终数据结果}}4.2.4 文件上传下载(1)上传
/** * 用@DataFile注解修饰要上传的参数对象 * OnProgress参数为监听上传进度的回调函数 */@Post(url = "/upload")Map upload(@DataFile("file") String filePath, OnProgress onProgress);调用上传接口以及监听上传进度的代码如下:
Map result = myClient.upload("D:\TestUpload\xxx.jpg", progress -> {System.out.println("total bytes: " + progress.getTotalBytes());// 文件大小System.out.println("current bytes: " + progress.getCurrentBytes());// 已上传字节数System.out.println("progress: " + Math.round(progress.getRate() * 100) + "%");// 已上传百分比if (progress.isDone()) {// 是否上传完成System.out.println("--------Upload Completed!--------");}});在文件上传的接口定义中,除了可以使用字符串表示文件路径外,还可以用以下几种类型的对象表示要上传的文件:


推荐阅读