通常情况,PHP获取上游传来的参数,即外部变量,使用 $_POST、$_GET、$_REQUEST 就可以了。

其中,$_REQUEST 是个组合体,默认情况包含了 $_GET,$_POST 和 $_COOKIE。

GET 方式我们知道,通过 URL 传递参数(又叫 query string),只要你的URL带有 query string 就没啥问题;

POST 方式就有点复杂了,$_POST 中获取变量的前提是,发起请求的 Content-Type 必须得是 application/x-www-form-urlencoded 或 multipart/form-data 格式;

因为一般用PHP处理的是网页请求,上面这两种格式都是默认的,所以没啥问题;
而一旦用PHP给第三方提供接口时,就会遇到另一种情况:
第三方使用的 Content-Type 不是上面提到的两种

纯接口常用的一般是 application/json 格式,当然还有 text/xml、text/plain、stream 等其他类型;
这个情况用 $_GET(或者$_REQUEST) 只能获取第三方写在URL中的参数(该数组不仅仅对GET请求生效,所有带 query string 的请求都可以),而 json 格式的参数,就无能为力了。

这就要用到 file_get_contents('php://input') 了;
php://input 允许读取【请求方】的原始数据, 适用于大多数类型的 Content-type,不止是上面提到的几种,但不能用于 multipart/form-data 类型。
也就是说,当 Content-Type 为 application/x-www-data-urlencoded 时,php://input 获取的数据,和 $_POST 获取的数据一致。

言而总之:

  • 如果用 $_POST、$_GET、$_REQUEST 获取不到参数时,可以用 php://input 打印一下原始数据瞅瞅;
  • 如果和 第三方 对接接口,尽量用 file_get_contents('php://input') 比较稳妥;


后厂村村长
7 声望2 粉丝

Hello, Debug World