form表单请求Content-Type合法类型有哪些?如何设置?
发布于 作者:苏南大叔 来源:程序如此灵动~

同样都是表单POST
,contentType
的类型不同,则实际发生的数据形式也会不同,在后台接收POST
表单的方式也有所不同。表面上来说,都是POST
,但后端接收数据的方式却大不同。本文主要讨论的内容就是:表单的Content-Type
。

苏南大叔的程序如此灵动博客,记录苏南大叔和计算机代码的故事。测试环境:谷歌浏览器。服务器端使用php@74
来做测试接收数据。下面的每个标题其实就是form
的enctype
属性,或者说是请求头中的Content-Type
。如果服务器端没有拿到预料中的数据,去检测一下Content-Type
。
默认enctype
,application/x-www-form-urlencoded

带文件上传enctype
,multipart/form-data
不常见的enctype
,text/plain
虽然没有人这么提交过表单,但是它确实是合法的,上述代码提交后的结果是这样的:
php
的$_POST
并没有解析到这种情况,它是通过file_get_contents("php://input")
获得的数据。
其中的File
类型也只是简化为一个文件名。各数据中间使用换行符分割。并且,没有自动处理textarea
里面的换行符。所以,这种text/plain
类型,不知道到底存在意义是什么。(下面的其它部分,将对这种类型再次处理)
其它enctype
合法的form
的enctype
属性,除了常见的application/x-www-form-urlencoded
和multipart/form-data
,还有这个不常见的text/plain
。
不是这三个的form
的enctype
属性,会被强制修改成application/x-www-form-urlencoded
,在form
表单提交的时候,会被强制修改。
会被强制修改的情况,仅限制于form
表单的形式提交(前端用js
访问enctype
属性的时候,就会发现已经被强制修改)。如果是jquery
的ajax
,或者axios
等形式的表单数据提交,并不在此之列。
如下的三个类型,将改用js
拦截提交。使用的是axios
进行提交:

text/plain
【合法,但不常见】
application/json
【常见,但不合法】
这个application/json
很常见,但是却不是合法的form
的enctype
属性。所以,这个application/json
并不会出现在enctype
的位置,而是出现在使用ajax
的情形下。
这里的enctype="application/json"
会被自动修正为enctype="application/x-www-form-urlencoded"
。
text/xml
【不常见不合法】
这里的enctype="text/xml"
会被自动修正为enctype="application/x-www-form-urlencoded"
。
php
后端接收测试逻辑
下面的代码时php
后端的逻辑,对于application/x-www-form-urlencoded
和multipart/form-data
的情况,是可以使用$_POST
进行处理的。但是其它的类型,只能使用php://input
进行接收。

结束语
各个不同的后端编程语言,对于POST
的数据处理方式,有着很大的不同,本文仅仅是使用php
来做相关数据测试。


