实现思路
- 创建
URL
对象,指定目标服务器的地址。
- 通过
URL
对象获取 URLConnection
,并设置其为可输出,因为要发送数据。
- 设置请求方法为
POST
,并设置相关请求头,如 Content-Type
为 multipart/form-data
,用于文件上传。
- 创建一个
DataOutputStream
用于向服务器输出数据。
- 构建请求参数,包括普通参数和文件参数,按照
multipart/form-data
的格式拼接数据。
- 将构建好的数据通过
DataOutputStream
写入到连接中。
- 获取服务器的响应,通过
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);
}
}