记一次php的$_POST获取不到值的问题

先来科普:

Content-Type的类型:

常见的媒体格式类型如下:

text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式

以application开头的媒体格式类型:

application/xhtml+xml :XHTML格式
application/xml: XML数据格式
application/atom+xml :Atom XML聚合格式
application/json: JSON数据格式
application/pdf:pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

上传文件

multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

普通的post提交在php中用$_POST[‘xxx’]可以得到信息,此时的content-type:application/x-www-form-urlencoded

如果前端的content-type=application/json,$_POST['xxx'] 不能接收到post的入参,
此时想接收信息,需要用file_get_contents("php://input")
获得信息之后,json_decode($post,true);

另一个问题:

此时发现每次刷新接口都是两次请求,第一次是POST,第二次是OPTION
发生option请求的原因是因为产生了复杂请求

2.1 什么是OPTIONS请求?
CORS MDN是这么描述的

跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用OPTIONS方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。

OPTIONS请求即预检请求,可用于检测服务器允许的http方法。当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起OPTIONS请求,即CORS预检请求,服务器若接受该跨域请求,浏览器才继续发起正式请求。

2.2 哪些请求会发送options请求?
这里就要说说请求的分类:简单请求和预检请求。
简单请求:满足以下几种情况(日常开发基本上只会注意前两种)

使用GET、POST、HEAD其中一种方法
只使用了如下的安全首部字段,不得人为设置其他首部字段
Accept
Accept-Language
Content-Language
Content-Type 仅限以下三种:
text/plain
multipart/form-data
application/x-www-form-urlencoded

HTML头部header field字段:DPR、Download、Save-Data、Viewport-Width、WIdth
请求中的任意XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问
请求中没有使用 ReadableStream 对象

预检请求:满足以下几种情况

1.使用了PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH方法
2.人为设置了非规定内的其他首部字段,参考上面简单请求的安全字段集合,还要特别注意Content-Type的类型

3\XMLHttpRequestUpload 对象注册了任何事件监听器
4、请求中使用了ReadableStream对象

请求附带身份凭证 >. cookies

发起请求时设置withCredentials 标志设置为true,从而向服务器发送cookie, 但是如果服务器端的响应中未携带Access-Control-Allow-Credentials: true,浏览器将不会把响应内容返回给请求的发送者。
对于附带身份凭证的请求,服务器不得设置Access-Control-Allow-Origin 的值为*, 必须是某个具体的域名。
注意,简单的GET请求不会触发预检,如果对此类带有身份凭证请求的响应中不包Access-Control-Allow-Credentials: true,这个响应将被忽略掉,并且浏览器也不会将相应内容返回给网页

2.3 OPTIONS请求有什么?
预检请求头request header的关键字段:

Access-Control-Request-Method:告诉服务器实际请求所使用的 HTTP 方法
Access-Control-Request-Headers:告诉服务器实际请求所携带的自定义首部字段

服务器基于从预检请求头部获得的信息来判断,是否接受接下来的实际请求。

预检响应头response header的关键字段:

Access-Control-Allow-Methods:返回了服务端允许的请求,包含GET/HEAD/PUT/PATCH/POST/DELETE
Access-Control-Allow-Credentials:允许跨域携带cookie(跨域请求要携带cookie必须设置为true)
Access-Control-Allow-Origin:允许跨域请求的域名,这个可以在服务端配置一些信任的域名白名单
Access-Control-Request-Headers:客户端请求所携带的自定义首部字段content-type

此次options请求返回了响应头的内容,但没有返回响应实体response body内容。

猜你喜欢

转载自blog.csdn.net/lxy4239/article/details/115385044