当客户端发起文件提交请求时Apache會将所接收到的内容转交给mod_php5模块。 当PHP接收到请求后首先会调用sapi_activate,在此函数中程序会根据请求的方法处理数据如示例中POST方法,其调用过程如下:
以上代码的关键在于SG(known_post_content_types)变量 此变更是在SAPI启动时初始化全局变量时被一起初始化的,其基本过程如下:
后面获取Content-Type的过程就比较简单叻:
比如用$.ajax方法发送请求时(data参数是一个JSON.stringify()处理后的字符串而不是一个JSON对象):
这个两种数据处理如下:
服务器为什么会对表单提交和文件仩传做特殊处理,因为表单提交数据是名值对的方式且Content-Type为application/x-www-form-urlencoded,而文件上传服务器需要特殊处理普通的post请求(Content-Type不是application/x-www-form-urlencoded)数据格式不固定,不┅定是名值对的方式所以服务器无法知道具体的处理方式,所以只能通过获取原始数据流的方式来进行解析
jquery在执行post请求时,会设置Content-Type为application/x-www-form-urlencoded所以服务器能够正确解析,而使用原生ajax请求时如果不显示的设置Content-Type,那么默认是text/plain这时服务器就不知道怎么解析数据了,所以才只能通過获取原始数据流的方式来进行解析请求数据