1. Content-Type: application/x-www-form-urlencoded
表示纯文本表单提交方式
格式如下:
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
name=zhangsan&gender=male
对应的 Retrofit 代码:
@FormUrlEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String gender);
对于 GET 请求也有可能使用这种类型。
2. Content-Type: multipart/form-data;boundary=[分隔符]
包含文件的多文本表单提交方式
格式如下:
POST /home/upload.html HTTP/1.1
Accept: text/plain, */*
Accept-Language: zh-cn
Host: 192.168.24.56
Content-Type:multipart/form-data;boundary=-----------------------------7db372eb000e2
Content-Length: 3693
Connection: Keep-Alive
-------------------------------7db372eb000e2
Content-Disposition: form-data; name=“username”
admin
-------------------------------7db372eb000e2
Content-Disposition: form-data; name=“file”; filename=“kn.jpg”
Content-Type: image/jpeg
(此处省略jpeg文件二进制数据…)
-------------------------------7db372eb000e2–
注意这一行: Content-Type: multipart/form-data; boundary=---------------------------7db372eb000e2
,根据 RFC1867,在这种方式下,Content-Type:multipart/form-data
字段是必须的。它包括一个名为 boundary
的标志,它可以是随便输入的字符串,对后面的具体内容也是必须的,它用来分辨一段内容的开始。
Content-Length: 3693 ,这里的 3693 是要上传文件的总长度。
绿色字体部分就是需要上传的数据,可以是文本,也可以是图片等。数据内容前面需要有 Content-Disposition, Content-Type 以及 Content-Transfer-Encoding 等说明字段。
最后的紫色部分就是协议的结尾了。
---------------------------7db372eb000e2
是分隔符,分隔多个文件、表单项。其中 b372eb000e2
是即时生成的一个数字,用以确保整个分隔符不会在文件或表单项的内容中出现。
Form 每个部分用分隔符分割,分隔符之前必须加上 “--
” 这两个字符(即--{boundary}
)才能被 http 协议认为是 Form 的分隔符,表示结束的话,在正确的分隔符后面添加"--
"表示结束(即--{boundary}--
)。
前面的
---------------------------7d
是 IE 特有的标志,Mozila 为---------------------------71
每个分隔的数据的都可以用 Content-Type 来表示下面数据的类型,可以参考 rfc1341 例如 :Contect-Type:image/jpeg
表示下面的数据是jpeg
文件数据。
对应的 Retrofit 代码:
@Multipart
@POST("/users")
Call<User>