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

我请求链接以获取 JSON,但 response.body().string() 值始终有错误。另一种方法是,我将response.body().string()拆分为response.body()和字符串,但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();

    }

}


暮色呼如
浏览 291回答 3
3回答

明月笑刀无情

response.body().string() → 您只能调用 string() 一次。由于响应正文可能很大,因此 OkHttp 不会将其存储在内存中,而是在您需要时将其作为流从网络读取。当您将正文作为 string() 读取时,OkHttp 将下载响应正文并将其返回给您,而不保留对字符串的引用,如果没有新请求,则无法下载两次。您不止一次地调用它。try(..){    System.out.println(response.body().string());// once    return response.body().string();`// twice }您可以通过调用一次将响应保存在变量中,然后使用该变量进行进一步使用。try(..){  String responseData = response.body().string();//Be cautious about memory constraint here.  System.out.println(responseData);  return responseData;`}

当年话下

发生这种情况是因为.string()只能调用一次您可以通过以下方式解决该问题(Java):ResponseBody responseBodyCopy = response.peekBody(Long.MAX_VALUE); responseBodyCopy.string();通过复制响应正文,您可以避免使用.string()两次

胡子哥哥

也许你正在像这样的拦截器中关闭你的响应override fun intercept(chain: Interceptor.Chain): Response {//...val response = chain.proceed(builder.build())response.close()//...}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java