对于 API 测试,我必须使用 io.micronaut.http.client.HttpClient 解析请求的响应
我更喜欢使用下面给出的格式。
Response<User> response =
client.toBlocking().retrieve(HttpRequest.POST("/", user), Response.class);
但是它不起作用。我在尝试从响应中获取用户时遇到类型转换错误
User user = response.getUser();
目前我正在使用ObjectMapper (Jackson),如下所示,
String response = client.toBlocking().retrieve(HttpRequest.POST("/", user), String.class);
ObjectMapper objectMapper = new ObjectMapper();
Response<User> response = objectMapper.readValue(response, new TypeReference<Response<User>>() {});
有没有办法直接将TypeReference与HttpClient检索方法一起使用?或者通过 HttpClient 使用泛型类类型的任何其他方式。
其他有用的信息
// Response generic class
class Response<T> {
T data;
....
}
响应示例
{
"data": {
"name":"sample"
},
"message": "Success"
}
最佳答案
您有多种选择:
如果您只需要那个User
对象实例,您可以通过 retrieve()
来完成方法,其中第二个参数是域类(在您的情况下为 User
),然后您可以使用 user
根据需要变量:
User user = client.toBlocking().retrieve(HttpRequest.POST("/", user), User.class);
assertThat(user)
.isNotNull()
.extracting(User::getName)
.isEqualTo("sample");
如果您还需要响应对象(例如能够检查响应代码),那么您应该使用 exchange()
方法然后得到User
通过调用 body()
实例该响应的方法:
HttpResponse<User> response = client.toBlocking()
.exchange(HttpRequest.POST("/", user), User.class);
assertThat(response)
.isNotNull()
.extracting(HttpResponse::body)
.extracting(User::getName)
.isEqualTo("sample");
更新:当您需要使用泛型类作为响应时,您必须使用 Argument.of()
作为 retrieve()
的第二个参数和exchange()
您可以在其中指定响应泛型类及其类型参数的方法。请参阅示例:
Response<User> response = client.toBlocking()
.retrieve(HttpRequest.POST("/", user), Argument.of(Response.class, User.class));
assertThat(response)
.isNotNull()
.extracting(Response::getData)
.extracting(User::getName)
.isEqualTo("sample");
如果你没有 Argument.of()
就这样做那么它将转换 data
属性(property)进入LinkedHashMap
而不是User
还有这个:
Response<User> response = client.toBlocking().retrieve(HttpRequest.POST("/", user), Response.class);
response.getData().getName();
...会抛出 ClassCastException
:
java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class my.app.domain.User (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; my.app.domain.User.User is in unnamed module of loader 'app')
关于java - Micronaut HTTP 客户端 - 反序列化通用类型 - 用于 API 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61476579/