✒️ 读取数据
Forest响应对象提供了多种数据读取的方式,以读取不同类型的数据
# 自定义对象类型
Forest响应对象可以直接读取经过反序列化后的自定义类型的对象
该对象的类型必须和 ForestResponse<泛型参数>
中泛型参数指向的类型一致
public interface MyClient {
/**
* Get类型请求,url路径为 /test
* <p>ForestResponse是带泛型参数的类型
* <p>泛型参数代表返回的响应数据所期望转化成的类型
*
* @return Forest响应对象
*/
@Get("/test")
ForestResponse<MyUser> getUser();
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
然后通过getResult
方法获取转换后的对象
getResult()
获取反序列化成对象类型的请求响应内容
// 发送请求,并获取从服务端返回的响应数据对象
ForestResponse<getUser> response = myClient.getUser();
// 获取转换后的响应结果对象
MyUser user = response.getResult();
1
2
3
4
2
3
4
# 字符串类型
readAsString()
以字符串方式读取请求响应内容
// 以字符串方式读取请求响应内容
String content = response.readAsString();
1
2
2
# 字节数组类型
getByteArray()
以字节数组的形式获取请求响应内容
// 以字节数组的形式获取请求响应内容
byte[] bytes = response.getByteArray();
1
2
2
# 流类型
getInputStream() throws Exception
以输入流的形式获取请求响应内容
友情提示
- 以流的方式读取数据的时候,一定别忘了在读取完毕后关闭流
- 流只能读取一次,关闭流后不能从
response.getInputStream()
以及其它数据读取方法中再次读取
// 以 try-with-resource 方式读取流后,会自动关闭流
try (InputStream in = response.getInputStream()) {
// 从流中读取字符串数据
String content = IOUilts.toString(in, StandardCharsets.UTF_8);
} catch (Exception ex) {
ex.printStackTrace();
}
1
2
3
4
5
6
7
2
3
4
5
6
7
调用response.close()
方法亦可关闭响应的流
try {
// 获取响应流
InputStream in = response.getInputStream()
// 从流中读取字符串数据
String content = IOUilts.toString(in, StandardCharsets.UTF_8);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
// 关闭响应流
// 关闭后不可再通过响应对象的数据读取方法获取数据
response.close();
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 后验类型
用以上的方式获取的数据,都必须和ForestResponse<T>
中的泛型参数T
保持一致,或者和接口方法的返回类型一致,不然就会出现类型转换的异常
这种方式也叫先验类型转换
,也就是说它必须在发送请求之前,就已经知道返回的数据类型是什么了,并且难以改变
而从1.5.27
版本开始,Forest 提供了get
方法,可以在接受到请求的响应数据后,再临时决定按什么类型来取数据,这就叫后验类型转换
get(Class
<T>
clazz) 将响应数据转换成目标类型,并按该类型返回
- 版本:
1.5.27+
- 参数
clazz
: Class类型 - 目标类型
// 转换成字符串类型并返回
String strResult = response.get(String.class);
// 转换成Map类型(不含泛型)并返回
List list = response.get(List.class);
// 转换成Map类型(不含泛型)并返回
Map map = response.get(Map.class);
// 转换成自定义类型对象并返回
MyUser userResult = response.get(MyUser.class);
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
获取带泛型的类型数据
get(TypeReference
<T>
typeReference) 将响应数据转换成目标类型,并按该类型返回
- 版本:
1.5.27+
- 参数
typeReference
: TypeReference类型 - 目标类型
// 转换并获取 List<String> 类型列表数据
List<String> list = repsonse.get(new TypeReference<List<String>>() {});
// 转换并获取 Map<String, Object> 类型数据
Map<String, Object> map = repsonse.get(new TypeReference<Map<String, Object>>() {});
// 转换并获取 Result<MyUser> 类型数据
Result<MyUser> result = response.get(new TypeReference<Result<MyUser>>() {});
1
2
3
4
5
6
2
3
4
5
6
注意
get(Class<T>)
方法和get(TypeReference<T>)
每次调用都会进行一次序列化转换
在一些性能敏感的场景中应谨慎使用,避免重复的数据转换
帮助我们改善此文档 (opens new window)
上次更新: 2023/06/19, 17:37:19