一、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。

//构建MimeMultipartMimeMultipart mimeMultipart = new MimeMultipart();//构建MimeBodyPart申请头InternetHeaders header1 = new InternetHeaders();header1.setHeader("Content-Type", "multipart/form-data");header1.setHeader("Content-Disposition", "form-data; name=\"name\"");//MimeMultiPart增加MimeBodyPartmimeMultipart.addBodyPart(new MimeBodyPart(header1, "Jack".getBytes()));//创立entityByteArrayOutputStream 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-datapostMethod.addRequestHeader("Content-Type", "multipart/form-data");httpClient.executeMethod(postMethod);

打印下面的申请参数MimeMultipart

------=_Part_0_708049632.1604484390512Content-Type: multipart/form-dataContent-Disposition: form-data; name=“name”Jack        ------=_Part_0_708049632.1604484390512Content-Type: multipart/form-dataContent-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...