一.概况
我们知道app开发中用到网络请求的部分绝大多数都是http或者https,在开发过程中要想要正确从服务端获取数据我们就要严格遵守http协议。我们开发中绝大部分使用的是get和post请求,在get请求时候如果拼接字段中有中文就要注意编码问题(可能出现乱码)参考get请求时候参数中含有“中文”字段出现乱码问题的原因和解决方法;如果使用post请求,那么要和后台协商好requestBody中content-type,这里记录一下content-type相关的。
二.Content-type
HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。
HTTP协议规定POST提交数据必须放在消息体中,但是没有规定数据必须要使用什么编码方式。事实上,开发这可以自己决定消息主题的格式,只要满足HTTP协议要求的格式就行。
但是,数据不光要能发送出去,还要服务端能过正确接受解析,一般在服务端例如java,php等语言都内置了自动解析常见数据结构格式的功能。一般是根据请求头中Content-type字段来获取消息体的编码方式,然后对消息体进行解析。所以POST提交数据,包含Content-type和消息体数据。
三.Content-type选择
3.1 application/x-www-form-urlencoded
常见的 POST 提交数据的方式,浏览器的原生form表单。例如我们在使用okhttp的时候用的FormEncodingBuilder(2.7.0版本中)。FormEncodingBuilder里面默认使用的就是application/x-www-form-urlencoded,如下
public final class FormEncodingBuilder {
private static final MediaType CONTENT_TYPE =
MediaType.parse("application/x-www-form-urlencoded");
--------代码省略---------
public RequestBody build() {
return RequestBody.create(CONTENT_TYPE, content.snapshot());
}
}
3.2 multipart/form-data
常见的 POST 数据提交的方式,我们使用表单上传文件时使用。可以用来上传文件用。例如我们在使用okhttp的时候用的MultipartBuilder。使用例子如下(这里不赘述添加文件的过程,只展示设置content-type)
MultipartBuilder builder = new MultipartBuilder() .type(MultipartBuilder.FORM);
里面的MultipartBuilder.FORM源码如下
public static final MediaType FORM = MediaType.parse("multipart/form-data");
3.3 application/json
常见的 POST 提交数据的方式,application/json 这个 Content-Type 作为响应头很常见,同时现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串也很常见了。JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。使用如下(还是以okhttp为例子)
--------代码省略---------
public static final MediaType JSON=MediaType.parse("application/json; charset=utf-8");
--------代码省略---------
RequestBody requestBody = RequestBody.create(JSON, json);//json为要传的json字符串
--------代码省略---------