MST

星途 面试题库

面试题:Java的URLConnection处理复杂POST请求

假设要使用URLConnection发送一个包含多个参数(包括文件上传)的复杂POST请求,在Java中如何实现?请描述具体实现思路和关键代码片段。
12.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 创建 URL 对象,指定目标服务器的地址。
  2. 通过 URL 对象获取 URLConnection,并设置其为可输出,因为要发送数据。
  3. 设置请求方法为 POST,并设置相关请求头,如 Content-Typemultipart/form-data,用于文件上传。
  4. 创建一个 DataOutputStream 用于向服务器输出数据。
  5. 构建请求参数,包括普通参数和文件参数,按照 multipart/form-data 的格式拼接数据。
  6. 将构建好的数据通过 DataOutputStream 写入到连接中。
  7. 获取服务器的响应,通过 InputStream 读取响应数据。

关键代码片段

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.UUID;

public class ComplexPostRequest {
    private static final String BOUNDARY = UUID.randomUUID().toString();
    private static final String LINE_FEED = "\r\n";
    private static final String CHARSET = "UTF-8";
    private static final String URL = "http://yourserver.com/api";
    private static final String FILE_PATH = "/path/to/your/file.txt";

    public static void main(String[] args) throws IOException {
        URL url = new URL(URL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
        connection.setRequestProperty("charset", CHARSET);

        DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());

        // 添加普通参数
        addFormField(outputStream, "param1", "value1");
        addFormField(outputStream, "param2", "value2");

        // 添加文件参数
        addFilePart(outputStream, "file", FILE_PATH);

        // 结束请求数据
        outputStream.writeBytes(LINE_FEED + "--" + BOUNDARY + "--" + LINE_FEED);
        outputStream.close();

        // 获取响应
        int responseCode = connection.getResponseCode();
        System.out.println("Response Code: " + responseCode);

        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: " + response.toString());
    }

    private static void addFormField(DataOutputStream outputStream, String name, String value) throws IOException {
        outputStream.writeBytes("--" + BOUNDARY + LINE_FEED);
        outputStream.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"" + LINE_FEED);
        outputStream.writeBytes("Content-Type: text/plain; charset=" + CHARSET + LINE_FEED);
        outputStream.writeBytes(LINE_FEED);
        outputStream.writeBytes(value + LINE_FEED);
    }

    private static void addFilePart(DataOutputStream outputStream, String fieldName, String filePath) throws IOException {
        File file = new File(filePath);
        outputStream.writeBytes("--" + BOUNDARY + LINE_FEED);
        outputStream.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\"; filename=\"" + file.getName() + "\"" + LINE_FEED);
        outputStream.writeBytes("Content-Type: " + URLConnection.guessContentTypeFromName(file.getName()) + LINE_FEED);
        outputStream.writeBytes("Content-Transfer-Encoding: binary" + LINE_FEED);
        outputStream.writeBytes(LINE_FEED);

        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = fileInputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        fileInputStream.close();
        outputStream.writeBytes(LINE_FEED);
    }
}