HttpRequest中的ContentType

一.概况

我们知道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字符串
--------代码省略---------

猜你喜欢

转载自blog.csdn.net/gongxiaoou/article/details/83788802