【问题标题】:OkHTTP checking response is null pattern?OkHTTP 检查响应为空模式?
【发布时间】: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 语句/陷阱?

【问题讨论】:

    标签: java okhttp


    【解决方案1】:

    你可以写

    if (response.body() == null || StringUtils.isEmpty(response.body().string())) {
         throw new ApiException("Unable to generate Magic Link: Empty Response Body From site");
    }
    

    如果or-operator之前的response.body() == null检查是true,or-operator之后的检查将不会被执行。相反,它将立即执行 if 语句中的代码。仅当第一次检查返回 false 时才会执行第二次检查。

    这就是为什么你永远不会用这个 if 语句得到NullPointerException。这就是我认为你所关心的,对吧?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-16
      • 2012-12-13
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 2023-03-08
      • 2015-12-24
      • 1970-01-01
      相关资源
      最近更新 更多