OKHttp 响应失败:java.lang.IllegalStateException:关闭

Kam*_*mil 2 java android okhttp

我请求链接以获取 JSON 但 response.body().string() 值总是有错误。另一种方式,我将 response.body().string() 拆分为 response.body() 和 string 但 Android studio 没有找到 ResponseBody。2 方法不起作用。请帮忙!

String doGetRequest(String url) throws IOException {
       Request request = new Request.Builder()
            .url(url)
            .build();

    try (Response response = client.newCall(request).execute()) {
        System.out.println(response.body().string());
        //ResponseBody responseBody = response.body();
        //String content = responseBody.string();
        //System.out.println(content);
        return response.body().string();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*kov 12

发生这种情况是因为.string()只能调用一次

您可以通过以下方式解决该问题(Java):

ResponseBody responseBodyCopy = response.peekBody(Long.MAX_VALUE);
responseBodyCopy.string();
Run Code Online (Sandbox Code Playgroud)

通过复制响应正文,您可以避免使用.string()两次


Vik*_*tel 5

response.body().string() ? 您只能调用 string() 一次。

因为响应体可能很大,所以 OkHttp 不会将其存储在内存中,它会在您需要时将其作为流从网络读取。

当您将正文作为 string() 读取时,OkHttp 会下载响应正文并将其返回给您而不保留对字符串的引用,如果没有新请求,则无法下载两次。

你不止一次调用它。

try(..){
    System.out.println(response.body().string());// once
    return response.body().string();`// twice
 }
Run Code Online (Sandbox Code Playgroud)

您可以通过调用一次将响应保存在变量中,然后将该变量用于进一步使用。

try(..){
  String responseData = response.body().string();//Be cautious about memory constraint here.
  System.out.println(responseData);
  return responseData;`
}
Run Code Online (Sandbox Code Playgroud)