java 报文格式错误_HTTP POST请求报文格式分析与Java实现文件上传

本文详细介绍了HTTP POST请求的报文格式,特别是文件上传的报文结构,包括请求头和请求实体的分析。同时,通过Java代码展示了如何模拟文件上传的HTTP请求,包括设置请求头、构造请求实体以及使用Apache Httpmime库进行文件上传的方法。
摘要由CSDN通过智能技术生成

在开发中,我们使用的比较多的HTTP请求方式基本上就是GET、POST。其中GET用于从服务器获取数据,POST主要用于向服务器提交一些表单数据,例如文件上传等。而我们在使用HTTP请求时中遇到的比较麻烦的事情就是构造文件上传的HTTP报文格式,这个格式虽说也比较简单,但也比较容易出错。今天我们就一起来学习HTTP POST的报文格式以及通过Java来模拟文件上传的请求。

首先我们来看一个POST的报文请求,然后我们再来详细的分析它。

POST报文格式

POST /api/feed/ HTTP/1.1

Accept-Encoding: gzip

Content-Length: 225873

Content-Type: multipart/form-data; boundary=OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp

Host: www.myhost.com

Connection: Keep-Alive

--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp

Content-Disposition: form-data; name="lng"

Content-Type: text/plain; charset=UTF-8

Content-Transfer-Encoding: 8bit

116.361545

--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp

Content-Disposition: form-data; name="lat"

Content-Type: text/plain; charset=UTF-8

Content-Transfer-Encoding: 8bit

39.979006

--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp

Content-Disposition: form-data; name="images"; filename="/storage/emulated/0/Camera/jdimage/1xh0e3yyfmpr2e35tdowbavrx.jpg"

Content-Type: application/octet-stream

Content-Transfer-Encoding: binary

这里是图片的二进制数据

--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--

这里我们提交的是经度、纬度和一张图片(图片数据比较长,而且比较杂乱,这里省略掉了)。

格式分析

请求头分析

我们先看 报文格式中的第一行:

POST /api/feed/ HTTP/1.1

这一行就说明了这个请求的请求方式,即为POST方式,要请求的子路径为/api/feed/,例如我们的服务器地址为www.myhost.com,然后我们的这个请求的完整路径就是 www.myhost.com/api/feed/,最后说明了HTTP协议的版本号为1.1。

Accept-Encoding: gzip

Content-Length: 225873

Content-Type: multipart/form-data; boundary=OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp

Host: www.myhost.com

Connection: Keep-Alive

这几个header的意思分别为服

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中发送HTTP POST请求并设置报文头的expect参数,并且请求体的格式是XML,可以使用Java内置的HttpURLConnection类。以下是一个示例代码: ```java import java.net.HttpURLConnection; import java.net.URL; import java.io.OutputStream; import java.io.BufferedReader; import java.io.InputStreamReader; public class HttpPostWithXmlAndExpectHeader { public static void main(String[] args) throws Exception { String url = "http://example.com/api"; String xmlBody = "<user><name>John</name><age>30</age></user>"; URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // 设置HTTP请求方法为POST con.setRequestMethod("POST"); // 设置报文头的expect参数 con.setRequestProperty("Expect", "100-continue"); // 设置请求体格式为XML con.setRequestProperty("Content-Type", "application/xml"); // 设置请求体 con.setDoOutput(true); OutputStream os = con.getOutputStream(); os.write(xmlBody.getBytes()); os.flush(); os.close(); // 获取响应 int responseCode = con.getResponseCode(); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // 输出响应 System.out.println("Response Code : " + responseCode); System.out.println("Response Body : " + response.toString()); } } ``` 在代码中,我们首先建立一个URL对象,然后使用HttpURLConnection打开连接。我们设置HTTP请求方法为POST,并设置报文头的expect参数为"100-continue"。接下来,我们设置请求体格式为XML,并设置请求体并发送请求。最后,我们获取响应并输出响应码和响应体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值