【发布时间】:2021-09-13 09:55:21
【问题描述】:
我正在使用 OkHttp 客户端,当我编写代码来使用 API 时,我收到关于 response.body().string() 可能为空的 SonarLint 警告。
但是响应存在先有鸡还是先有蛋的问题,因为它只能被消费一次,然后就被取消引用了。
这意味着我必须像这样构造我的代码:
检查响应对象是否为空
然后检查响应正文是否为空/空
这会导致两个独立但相似的 if 语句/捕获
try (var response = okHttpClient.newCall(siteMagicLinkRequest).execute()) {
if (response.body() == null) {
throw new ApiException("Unable to generate Magic Link: Null Response Body from site");
}
var responseString = response.body().string();
if (response.body() == null || StringUtils.isEmpty(responseString)) {
throw new ApiException("Unable to generate Magic Link: Empty Response Body From site");
}
if (response.isSuccessful()) {
return responseString;
} else {
final siteApiErrorResponse errorResponse = gson.fromJson(responseString, siteApiErrorResponse.class);
throw new ApiException(response.code(), errorResponse.getMessage());
}
} catch (IOException e) {
throw new AuthorizationException("Unable to generate Magic Link: " + e.getMessage());
}
我不能使用如下所示的浓缩 if 检查,因为它会丢失响应正文。
if (response.body() == null || StringUtils.isEmpty(responseString)) {
throw new ApiException("Unable to generate Magic Link: Empty Response Body From site");
}
是否有任何 OkHttp API 或其他模式可以用来简化此代码并删除额外的 if 语句/陷阱?
【问题讨论】: