一、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 形成
我只是应用 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…