杰瑞科技汇

Java request文件如何处理上传?

目录

  1. Java 内置方式:HttpURLConnection

    Java request文件如何处理上传?-图1
    (图片来源网络,侵删)
    • 简介
    • GET 请求示例
    • POST 请求示例
    • 优缺点
  2. 现代首选:OkHttp

    • 简介
    • 添加依赖
    • GET 请求示例
    • POST 请求示例(发送 JSON 和文件)
    • 优缺点
  3. 经典强大:Apache HttpClient

    • 简介
    • 添加依赖
    • GET 请求示例
    • POST 请求示例
    • 优缺点
  4. 总结与对比


Java 内置方式:HttpURLConnection

HttpURLConnection 是 Java 标准库 (java.net) 自带的一个类,无需引入任何外部依赖,它功能相对基础,足以应对简单的 HTTP 请求。

Java request文件如何处理上传?-图2
(图片来源网络,侵删)

简介

直接使用 JDK 提供的 API,轻量级,适合不希望引入第三方库的简单项目。

GET 请求示例

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionGetExample {
    public static void main(String[] args) {
        try {
            // 1. 创建 URL 对象
            String urlString = "https://jsonplaceholder.typicode.com/posts/1";
            URL url = new URL(urlString);
            // 2. 打开连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 3. 设置请求方法
            connection.setRequestMethod("GET");
            // 4. 设置请求头 (可选)
            connection.setRequestProperty("User-Agent", "MyJavaApp/1.0");
            // 5. 获取响应码
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);
            // 6. 读取响应数据
            if (responseCode == HttpURLConnection.HTTP_OK) { // 200
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                // 打印结果
                System.out.println("Response Body: " + response.toString());
            } else {
                System.out.println("GET request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

POST 请求示例

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionPostExample {
    public static void main(String[] args) {
        try {
            String urlString = "https://jsonplaceholder.typicode.com/posts";
            URL url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 1. 设置请求方法为 POST
            connection.setRequestMethod("POST");
            // 2. 设置 DoOutput 为 true,表示将向连接输出数据
            connection.setDoOutput(true);
            // 3. 设置请求头
            connection.setRequestProperty("Content-Type", "application/json; utf-8");
            connection.setRequestProperty("Accept", "application/json");
            // 4. 准备要发送的 JSON 数据
            String jsonInputString = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
            // 5. 发送请求体
            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInputString.getBytes("utf-8");
                os.write(input, 0, input.length);
            }
            // 6. 获取响应码
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);
            // 读取响应的逻辑与 GET 类似...
            if (responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_OK) { // 201 or 200
                // ... (省略读取响应的代码)
                System.out.println("POST request successful");
            } else {
                System.out.println("POST request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

优缺点

  • 优点:
    • 无需依赖,JDK 自带。
    • 轻量级。
  • 缺点:
    • API 相对繁琐,代码量大。
    • 功能有限,例如不支持异步请求、连接池等高级特性。
    • 处理 JSON、文件等复杂数据时非常不便。

现代首选:OkHttp

OkHttp 是目前 Java (以及 Android) 开发中最流行的 HTTP 客户端,它由 Square 公司(著名的开源公司)开发,以其高效、简洁和强大的功能而闻名。

简介

一个现代的、高效的 HTTP 客户端,支持同步和异步请求、自动重试、连接池、GZIP 压缩等。

添加依赖 (Maven)

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version> <!-- 请使用最新版本 -->
</dependency>

GET 请求示例

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttpGetExample {
    public static void main(String[] args) {
        // 1. 创建 OkHttp 客户端 (推荐使用单例模式)
        OkHttpClient client = new OkHttpClient();
        // 2. 创建请求
        Request request = new Request.Builder()
                .url("https://jsonplaceholder.typicode.com/posts/1")
                .get() // 显式指定 GET 方法 (可选,默认就是 GET)
                .build();
        try (Response response = client.newCall(request).execute()) {
            // 3. 执行请求并获取响应
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            // 4. 获取响应体
            String responseBody = response.body().string();
            System.out.println("Response Body: " + responseBody);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

POST 请求示例

发送 JSON 数据

Java request文件如何处理上传?-图3
(图片来源网络,侵删)
import okhttp3.*;
import java.io.IOException;
public class OkHttpPostExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();
        // 1. 创建请求体
        MediaType JSON = MediaType.get("application/json; charset=utf-8");
        String jsonBody = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
        RequestBody body = RequestBody.create(jsonBody, JSON);
        // 2. 创建请求
        Request request = new Request.Builder()
                .url("https://jsonplaceholder.typicode.com/posts")
                .post(body)
                .build();
        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            String responseBody = response.body().string();
            System.out.println("Response Body: " + responseBody);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

发送文件

// ... (OkHttpClient client = new OkHttpClient();)
// 1. 创建文件请求体
File file = new File("path/to/your/file.txt");
RequestBody fileBody = RequestBody.create(file, MediaType.parse("text/plain"));
// 2. 创建 Multipart 请求体
MultipartBody multipartBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("file", "file.txt", fileBody)
        .addFormDataPart("description", "This is a test file")
        .build();
// 3. 创建请求
Request request = new Request.Builder()
        .url("https://your-upload-endpoint.com/upload")
        .post(multipartBody)
        .build();
// ... (执行请求)

优缺点

  • 优点:
    • API 非常简洁、易读。
    • 功能强大:支持异步、同步、WebSocket、拦截器等。
    • 性能优异,内置连接池和缓存。
    • 社区活跃,文档完善。
  • 缺点:

    需要引入第三方依赖。


经典强大:Apache HttpClient

Apache HttpClient 是一个历史悠久、功能极其全面的 HTTP 组件库,它提供了对 HTTP 协议最底层的精细控制。

简介

一个成熟、稳定、功能极其丰富的 HTTP 客户端库,适合需要处理复杂 HTTP 场景的企业级应用。

添加依赖 (Maven)

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3.1</version> <!-- 请使用最新版本 -->
</dependency>
<!-- 如果需要处理 JSON,可以添加 -->
<dependency>
    <groupId>org.apache.httpcomponents.core5</groupId>
    <artifactId>httpcore5</artifactId>
    <version>5.2</version>
</dependency>

GET 请求示例

import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
public class ApacheHttpClientGetExample {
    public static void main(String[] args) {
        // 1. 创建 HttpClient 实例
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 2. 创建 HTTP GET 请求
            HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");
            // 3. 执行请求
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                // 4. 获取响应实体
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    // 将响应实体转换为字符串
                    String result = EntityUtils.toString(entity);
                    System.out.println("Response Body: " + result);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

POST 请求示例

import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.entity.StringEntity;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
public class ApacheHttpClientPostExample {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 1. 创建 HTTP POST 请求
            HttpPost post = new HttpPost("https://jsonplaceholder.typicode.com/posts");
            // 2. 创建 JSON 请求体
            String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
            StringEntity entity = new StringEntity(json);
            post.setEntity(entity);
            post.setHeader("Content-type", "application/json");
            // 3. 执行请求
            try (CloseableHttpResponse response = httpClient.execute(post)) {
                HttpEntity responseEntity = response.getEntity();
                if (responseEntity != null) {
                    String result = EntityUtils.toString(responseEntity);
                    System.out.println("Response Body: " + result);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

优缺点

  • 优点:
    • 功能最全面,对 HTTP 协议的支持最细致。
    • 非常稳定,适合企业级应用。
    • 配置灵活,高度可定制。
  • 缺点:
    • API 相对 OkHttp 来说更冗长、复杂。
    • 需要引入依赖。
    • 相比 OkHttp,配置和使用上略显繁琐。

总结与对比

特性/库 HttpURLConnection OkHttp Apache HttpClient
依赖 (JDK 内置) 需要 需要
API 简洁性 繁琐 非常简洁 较为冗长
功能 基础 强大 (异步、连接池等) 最全面
性能 一般 优异 优异
易用性 中等
适用场景 简单脚本、不想引入依赖的项目 绝大多数 Java 项目,特别是现代应用 企业级应用、需要精细控制 HTTP 协议的场景
推荐指数 ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐

最终建议

  • 对于新项目或绝大多数 Java 应用强烈推荐使用 OkHttp,它在易用性、性能和功能之间取得了完美的平衡,是目前社区的事实标准。
  • 对于快速原型或简单的工具脚本:如果不想引入任何外部库,HttpURLConnection 是一个可行的选择,但要做好处理繁琐 API 的准备。
  • 对于有特殊需求的企业级项目:如果项目已经使用了 Apache HttpClient,或者你需要利用其对 HTTP 协议最底层的精细控制(如复杂的认证、自定义协议等),Apache HttpClient 是一个可靠的选择。
分享:
扫描分享到社交APP
上一篇
下一篇