解决Java发送POST请求接收中文乱码问题:代码实现与优化建议
writeUTF("参数名=" + URLEncoder.encode("参数值", "UTF-8")); // 添加文件参数 file file = new file("文件路径"); string boundary = "----webkitformboundary7ma4ywxktrzu0gw"; // 设置请求头部分分隔符 outputstream.writebytes("--" + boundary + "\r\n"); // 添加文本参数 String parameter = "参数名=" + URLEncoder.encode("参数值", "UTF-8"); outputstream.writeBytes("Content-Disposition: form-data; name=\"" + parameter.split("=")[0] + "\"\r\n\r\n"); outputstream.writeBytes(URLEncoder.encode(parameter.split("=")[1], "UTF-8") + "\r\n"); // 添加文件参数 String filename = file.getName(); outputstream.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + filename + "\"\r\n"); outputstream.writeBytes("Content-Type: " + URLConnection.guessContentTypeFromName(filename) + "\r\n\r\n"); byte[] buffer = new byte[4096]; int bytesread; fileinputstream fileinputstream = new fileinputstream(file); while ((bytesread = fileinputstream.read(buffer)) != -1) { outputstream.write(buffer, 0, bytesread); } outputstream.writeBytes("\r\n"); // 请求结束符 outputstream.writeBytes("--" + boundary + "--\r\n"); outputstream.flush(); outputstream.close(); // 获取返回结果 bufferedreader bufferedreader = new bufferedreader(new inputstreamreader(connection.getinputstream())); string line; string result = ""; while ((line = bufferedreader.readline()) != null) { result += line; } bufferedreader.close(); connection.disconnect(); // 输出结果 system.out.println(result); } catch (exception e) { e.printstacktrace(); } 在url.openConnection()和requesturl.openConnection()中,URLObject.openConnection()最终是通过sun.net.www.protocol.http.HttpURLConnection类的openConnection()方法创建连接,而URL.openConnection()方法是通过new URLConnection(url)创建一个默认的URLConnection实例,而不是具体的HttpURLConnection,因此没有setRequestMethod()等方法。解决方法可以通过将URLObject转化为HttpURLConnection实例进行设置,如下所示: string url = "https://virtualcourse.zhihuishu.com/report/savereport"; try { URL requesturl = new URL(url); HttpURLConnection connection = (HttpURLConnection) requesturl.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"); DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); // 添加文本参数 outputStream.writeUTF("参数名=" + URLEncoder.encode("参数值", "UTF-8")); // 添加文件参数 File file = new File("文件路径"); String boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW"; // 设置请求头部分分隔符 outputStream.writeBytes("--" + boundary + "\r\n"); // 添加文本参数 String parameter = "参数名=" + URLEncoder.encode("参数值", "UTF-8"); outputStream.writeBytes("Content-Disposition: form-data; name=\"" + parameter.split("=")[0] + "\"\r\n\r\n"); outputStream.writeBytes(URLEncoder.encode(parameter.split("=")[1], "UTF-8") + "\r\n"); // 添加文件参数 String filename = file.getName(); outputStream.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + filename + "\"\r\n"); outputStream.writeBytes("Content-Type: " + URLConnection.guessContentTypeFromName(filename) + "\r\n\r\n"); byte[] buffer = new byte[4096]; int bytesRead; FileInputStream fileInputStream = new FileInputStream(file); while ((bytesRead = fileInputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.writeBytes("\r\n"); // 请求结束符 outputStream.writeBytes("--" + boundary + "--\r\n"); outputStream.flush(); outputStream.close(); // 获取返回结果 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; String result = ""; while ((line = bufferedReader.readLine()) != null) { result += line; } bufferedReader.close(); connection.disconnect(); // 输出结果 System.out.println(result); } catch (Exception e) { e.printStackTrace(); } 这部分代码实现了发送POST请求,并添加了文本和文件参数。其中涉及到的字符编码问题,使用了URLEncoder.encode()方法对参数进行编码,保证中文不乱码。在发送请求之前,设置了请求头部分的分隔符boundary,可以根据具体需要进行调整。在发送文件参数时,添加了文件名和文件类型的信息。 接收方接收到请求后,根据Content-Disposition头部分的信息,可以获取到发送的文本和文件参数。拿到请求体数据之后,可以根据具体情况进行处理,如保存文件到本地等。 需要注意的是,这段代码还可以优化,比如将读取文件的代码放在发送请求之前,减少等待时间,使用try-with-resources语句自动关闭输入、输出流等。 建议使用HTTPS协议进行请求,保证数据的安全性。 ######[AI写代码神器 | 1689点数解答 | 2024-05-20 09:09:07]
- 易语言实现高并发 HTTP 操作:多线程、线程池与异步操作实战(字节豆包 | 849点数解答 | 2025-06-03 23:17:33)252
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)405
- Java 创建 HTTP POST 请求实现文件上传:代码示例与注意要点 (字节豆包 | 300点数解答 | 2024-12-06 16:07:20)336
- 易语言模拟POST请求抓包内容:代码示例及注意要点揭秘(字节豆包 | 1131点数解答 | 2025-06-02 12:46:09)185
- PHP代码:循环检测域名状态,借助HTTP请求与CURL实现(GPT | 947点数解答 | 2024-10-27 11:56:50)259
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)305
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1134
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- PHP代码检查:安全、结构与性能的全面剖析及优化建议(字节豆包 | 267点数解答 | 2025-03-03 16:36:16)217
- “广”加密会变“歧”?常见加密算法里并无此结果! (阿里通义 | 136点数解答 | 2023-12-18 13:46:31)245
- C3期末:精准求解 3 - 20 范围内数列第 k 项值及注意要点(字节豆包 | 242点数解答 | 2025-06-15 11:26:19)135
- C++求解:查找3 - 20项数列第k项值及注意要点(字节豆包 | 325点数解答 | 2025-06-15 11:27:11)154