okhttp3保存response字节内容并将文件保存到本地

该代码示例展示了如何使用OkHttp库创建一个HTTP请求,添加自定义头部,执行请求并获取响应。响应体被转换为字节数组,然后根据Content-Disposition头的值解码文件名,将内容保存到指定路径的文件中。如果出现IOException,程序会捕获并打印堆栈轨迹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

response为
在这里插入图片描述

		OkHttpClient okHttpClient = new OkHttpClient();
        String fileName=null;
        try{
            Request request = new Request.Builder()
                    .url(urlStr)
                    .addHeader("x-token",token)
                    .addHeader("x-debugger","true")
                    .addHeader("contentType","application/json")
                    .addHeader("withCredentials","true")
                    .build();
            Response execute = okHttpClient.newCall(request).execute();
            byte[] byteArray=execute.body().bytes();
            String headerValue=execute.header("Content-Disposition");
            fileName= URLDecoder.decode(headerValue,"UTF-8");
            File file = new File(path+fileName);
            FileUtils.writeByteArrayToFile(file,byteArray);
        } catch (IOException e) {
            e.printStackTrace();
        }```

<think>我们正在处理关于OkHttp3库中HTTP响应使用的示例请求。根据用户的问题,我们需要展示如何使用OkHttp3库处理HTTP响应。同时,我们需要遵循系统级指令,特别是关于LaTeX格式和中文回答的要求。 参考引用: [^1] 提到了当响应码是304 Not Modified时,cacheResponse会被用作顶级响应。 [^2] 提供了关于重定向状态码(如300,301,302,303,307,308)的详细解释。 [^3] 提到了一个使用OkHttp的Android OAuth2库,支持资源所有者密码授权类型和令牌刷新。 但是,用户的问题集中在OkHttp3的响应使用示例上,因此我们将重点放在如何获取和处理响应上。 步骤: 1. 创建一个OkHttpClient实例。 2. 构建一个请求(Request)对象。 3. 使用客户端发送请求(同步或异步),获取响应(Response)。 4. 处理响应:检查响应码、读取响应体等。 注意:在Android中,网络操作不能在主线程中进行,因此通常使用异步调用,但示例中也可以展示同步调用(需要明确说明)。 我们将展示同步和异步两种方式。 同步调用示例(需要在后台线程执行): ```java OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://example.com") .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); // 获取响应头 Headers responseHeaders = response.headers(); for (int i = 0; i < responseHeaders.size(); i++) { System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i)); } // 获取响应体 String responseBody = response.body().string(); System.out.println(responseBody); } catch (IOException e) { e.printStackTrace(); } ``` 异步调用示例: ```java OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://example.com") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { try { if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); // 获取响应头 Headers responseHeaders = response.headers(); for (int i = 0; i < responseHeaders.size(); i++) { System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i)); } // 获取响应体 String responseBody = response.body().string(); System.out.println(responseBody); } catch (Exception e) { e.printStackTrace(); } } }); ``` 在异步调用中,回调方法在后台线程执行,因此可以在其中进行网络操作。 另外,关于重定向:OkHttp默认会跟随重定向。如果需要禁用重定向,可以配置OkHttpClient: ```java OkHttpClient client = new OkHttpClient.Builder() .followRedirects(false) .build(); ``` 根据引用[^2],我们可以知道不同重定向状态码的含义,而OkHttp会自动处理重定向(除非禁用)。 关于缓存:引用[^1]提到当响应码为304时,cacheResponse会被使用。在OkHttp中,我们可以通过配置缓存来利用这一点。 配置缓存的示例: ```java File cacheDirectory = new File(context.getCacheDir(), "http-cache"); int cacheSize = 10 * 1024 * 1024; // 10 MiB Cache cache = new Cache(cacheDirectory, cacheSize); OkHttpClient client = new OkHttpClient.Builder() .cache(cache) .build(); ``` 这样,当服务器返回304 Not Modified时,OkHttp会自动使用缓存。 最后,我们根据要求生成相关问题。</think>### OkHttp3 响应使用示例 在 OkHttp3 中处理 HTTP 响应主要通过 `Response` 对象实现,以下是关键使用方法和示例: #### 基本响应处理 ```java // 创建客户端和请求 OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://api.example.com/data") .build(); // 同步请求 try (Response response = client.newCall(request).execute()) { // 1. 检查响应码 if (response.isSuccessful()) { // 200-299 // 2. 获取响应体 String body = response.body().string(); System.out.println("Response body: " + body); // 3. 获取响应头 String contentType = response.header("Content-Type"); System.out.println("Content-Type: " + contentType); } else { System.out.println("Request failed: " + response.code()); } // 4. 处理重定向(自动跟随重定向) if (response.isRedirect()) { System.out.println("Redirected to: " + response.header("Location")); } } catch (IOException e) { e.printStackTrace(); } ``` #### 异步请求处理 ```java client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理网络错误 } @Override public void onResponse(Call call, Response response) throws IOException { try (ResponseBody body = response.body()) { if (!response.isSuccessful()) { // 处理非200响应 return; } // 处理响应数据 String data = body.string(); runOnUiThread(() -> updateUI(data)); // 获取缓存响应 Response cacheResponse = response.cacheResponse(); if (cacheResponse != null) { // 304 Not Modified 时使用缓存[^1] System.out.println("Using cached response"); } } } }); ``` #### 关键功能说明: 1. **响应状态检查**: - `response.code()`:获取 HTTP 状态码(如 200, 404) - `response.isSuccessful()`:检查 2xx 状态码 - `response.isRedirect()`:检查重定向状态(300-399)[^2] 2. **响应体处理**: - `response.body().string()`:获取字符串格式响应(自动关闭流) - `response.body().bytes()`:获取字节数组 - `response.body().charStream()`:获取字符流 3. **重定向处理**: - OkHttp 默认自动跟随重定向 - 可通过 `new OkHttpClient.Builder().followRedirects(false)` 禁用 - 重定向类型包括: - 301/308:永久重定向(保留方法) - 302/303/307:临时重定向(方法可能改变)[^2] 4. **缓存处理**: - `response.cacheResponse()`:获取缓存响应 - `response.networkResponse()`:获取网络响应 - 当收到 `304 Not Modified` 时,`cacheResponse` 会被使用[^1] #### 完整工作流程: ```mermaid graph TD A[发送请求] --> B{响应状态} B -->|200-299| C[处理响应体] B -->|300-399| D[处理重定向] B -->|400-599| E[处理错误] C --> F[解析数据] D --> G[获取Location头] G --> A ``` > **注意**: > 1. 响应体只能消费一次,多次调用 `body().string()` 会抛出异常 > 2. 同步请求需在后台线程执行(Android 主线程会报 `NetworkOnMainThreadException`) > 3. 使用后必须关闭响应(推荐 try-with-resources)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值