在了解content-type之前首先要了解http的协议规范,content-type属于请求头中

一、HTTP规范

  • HTTP 协议规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体
  • 协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
  • 但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如Java 等,以都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
  • 所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码(ps消息类型和;编码格式)方式两部分。

二、ajax中POST请求中的Content-Type

1)application/x-www-form-urlencoded
作用:提交的表单数据会转换为键值对并按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。
很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery的封装好的 Ajax,Content-Type默认值都是「application/x-www-form-urlencoded;charset=utf-8」。

如果你用原生js写ajax要用这种方式,一定要注意加上setRequestHeader(“Content-type”,“application/x-www-form-urlencoded”);否则服务端无法正常解析。

NSMutableURLRequest 如何设置请求头跟请求体 请求头设置编码格式_JSON


2)multipart/form-data这也是一个常见的 POST 数据提交的方式。

boundary(党追)

另一个常见的 POST 数据提交的方式, Form 表单的 enctype 设置为multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符(这就是boundary的作用)分开,类似我们上面Content-Type中的例子。

 由于这种方式将数据有很多部分,它既可以上传键值对,也可以上传文件,甚至多个文件。当上传的字段是文件时,会有Content-Type来说明文件类型;Content-disposition,用来说明字段的一些信息。每部分都是以 –boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(字段、文本或二进制等)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 –boundary– 标示结束。

NSMutableURLRequest 如何设置请求头跟请求体 请求头设置编码格式_数据_02


【注意】上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段原生 form 表单也只支持这两种方式,但是随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。


(3)application/json

作用:JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。

NSMutableURLRequest 如何设置请求头跟请求体 请求头设置编码格式_JSON_03


NSMutableURLRequest 如何设置请求头跟请求体 请求头设置编码格式_JSON_04


4)text/xml

相比于JSON,XML不能更好的适用于数据交换,它包含了太多的包装, 而且它跟大多数编程语言的数据模型不匹配,让大多数程序员感到诧异。

XML是面向数据的,JSON是面向对象和结构的,后者会给程序员一种更加亲切的感觉。

XML的作用不言而喻,用于传输和存储数据,它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据,在JSON出现之前是业界一大标准(当然现在也是),相比JSON的优缺点大家有兴趣可以上网search。因此,在POST提交数据时,xml类型也是不可缺少的一种,虽然一般场景上使用JSON可能更轻巧、灵活。

下面就是ajax Content-Type为text/xml的请求:

NSMutableURLRequest 如何设置请求头跟请求体 请求头设置编码格式_字段_05


NSMutableURLRequest 如何设置请求头跟请求体 请求头设置编码格式_JSON_06


没弄明白的问题:请求体不同获取不到数据,怎么和后端协商修改

以上都是post方式传值,如果是get方式传值的话

NSMutableURLRequest 如何设置请求头跟请求体 请求头设置编码格式_字段_07


默认参数通过url参数传递,请求的内容类型:application/x-www-form-urlencoded

毫无压力,因为我一直都是这么干的大笑,没有任何问题。好了,来换一下请求的内容类型:

1: //contentType: “application/json; charset=utf-8”,//(可以) 2: //contentType: “text/xml”,//(可以)

也都可以,参数获取正常。
这也就是我们说的get方式,参数是跟在url后边,与Content-Type无关。
而post方式的参数跟Coontent-type有关