1

一、multipart/form-data

Multipart/form-data形式的post与普通post请求的不同之处体现在请求头,请求体2个部分。

请求头

必须包含Content-Type信息,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中不同参数的内容(普通post请求的参数分割符默认为&,参数与参数值的分隔符为=)。具体的头信息格式如下:

Content-Type: multipart/form-data; boundary=${bound}

请求体

它也是一个字符串,不过和普通post请求体不同的是它的构造方式。普通post请求体是简单的键值对连接,格式如下:

k1=v1&k2=v2&k3=v3

multipart/form-data的格式如下:

--${bound}
Content-Disposition: form-data; name="k1" //第一个参数,相当于k1;然后回车;然后是参数的值,即v1
 
HTTP.pdf //参数值v1
--${bound}

其中Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。

二、Java构造Mime/multipart

下面是mime相关的API构成
邮件API.png

我只是使用mime的结构来构造请求参数,不需要发送邮件,所以并没有用到MimeMessage。

//构建MimeMultipart
MimeMultipart mimeMultipart = new MimeMultipart();

//构建MimeBodyPart请求头
InternetHeaders header1 = new InternetHeaders();
header1.setHeader("Content-Type", "multipart/form-data");
header1.setHeader("Content-Disposition", "form-data; name=\"name\"");
//MimeMultiPart添加MimeBodyPart
mimeMultipart.addBodyPart(new MimeBodyPart(header1, "Jack".getBytes()));

//创建entity
ByteArrayOutputStream bout = new ByteArrayOutputStream();
mimeMultipart.writeTo(bout);
RequestEntity entity = new ByteArrayRequestEntity(bout.toByteArray());

HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod(uri);
postMethod.setRequestEntity(entity);
//设置Content-type为multipart/form-data
postMethod.addRequestHeader("Content-Type", "multipart/form-data");
httpClient.executeMethod(postMethod);

打印上面的请求参数MimeMultipart

------=_Part_0_708049632.1604484390512
Content-Type: multipart/form-data
Content-Disposition: form-data; name=“name”

Jack        

------=_Part_0_708049632.1604484390512
Content-Type: multipart/form-data
Content-Disposition: form-data; name="age"

20

可以看到这是一个复合参数,最外层的Content-type是multipart/form-data,其中每个MimeBodyPart的Content-Type是form-data.其中------=_Part_0_708049632.1604484390512是每个参数的分界线boundary。

参考文档

https://www.cnblogs.com/xdp-g...
https://www.codota.com/code/j...
https://www.cnblogs.com/zhjh2...
https://www.cnblogs.com/wangh...


杜杜501
24 声望2 粉丝