Http上传需要用到multipart/form-data请求方式,Http协议原始方法不支持multipart/form-data请求,那这个请求自然就是由原始的请求方法拼装而成,具体规则如下:
1、multipart/form-data的本质上还是Post请求
2、multipart/form-data与post方法的不同之处:请求头,请求体。
3、multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个post的内容,如文件内容和文本内容自然需要分割开来,不然接收方就无法正常解析和还原这个文件了。
4、multipart/form-data的请求体也是一个字符串,不过和post的请求体不同的是它的构造方式,post是简单的name=value值连接,而multipart/form-data则是添加了分隔符等内容的构造体。
抓包结果如下:
Request URL:https://your_base_url/open/qiniu/image
Request Method:POST
Status Code:200 OK
Request Headers
Accept-Encoding:gzip
Connection:Keep-Alive
Content-Length:117276
Content-Type:multipart/form-data; boundary=ed67c97e-2000-47de-9033-77aeb8df43d9
Host:your_base_url
token:794d5240-de2a-465b-9a5a-66f71f567acd
User-Agent:Dalvik/2.1.0 (Linux; U; Android 5.1.1; vivo X7 Build/LMY47V) app_name/1.5.0
Request Payload
--ed67c97e-2000-47de-9033-77aeb8df43d9
Content-Disposition: form-data; name="file"; filename="coin.jpg"
Content-Type: image/jpg
Content-Length: 117075
--ed67c97e-2000-47de-9033-77aeb8df43d9--
可以看到Request Headers中包含了Accept-Encoding、Content-Length、Content-Type、Host、User-Agent等参数,OkHttp会自动生成boundary,无需手动编写规则;Request Payload中包含了具体的上传内容,Content-Disposition包含了上传文件名以及part参数key值,Content-Type指明了上传文件的后缀格式。
User-Agent一般都会重写,以其可以包含系统信息和用户自定义的信息,系统信息可以通过System.getProperty("http.agent")获得,然后再拼接上app独有的信息即可