我们一般使用GET或者POST请求方式向服务端传送参数,在PHP服务端中,对于不同的请求格式,获取参数的方式不同。
GET请求
GET请求是最简单的请求了,请求的参数直接以 key value的形式拼接在URL后面。如:
http://localhost/params.php?username=uusama&role=admin
在服务端的PHP中,可以使用全局对象 _GET 获取参数,也可以使用_REQUEST 获取:
var_dump(_GET);
var_dump(_REQUEST);
/** 两条语句结果相同:
array (size=2)
'username' => string 'uusama' (length=6)
'role' => string 'admin' (length=5)
*/
_GET 和_REQUEST 此时相同,其值为参数的key value 数组。但是一般推荐使用 $_GET,其性能更优而且更快。
POST请求
对于POST请求,获取参数的方法有如下几种:
- $_GET:获取URL中的参数
- $_POST: 获取以表单形式提交的参数
- $_REQUEST:$_GET 和 $_POST 的组合
- file_get_content(‘php://input’):获取原生的请求body流数据
对于POST请求,PHP会针对头部中的 Content-Type 字段,对 body 中的参数进行一定的处理。该字段指明了传送body的编码方式。常用的有以下几种:
- application/x-www-form-urlencoded:浏览器的原生 form 表单格式
- multipart/form-data:传输文件
- application/json:列化后的 JSON 字符串
- text/xml:XML-RPC协议数据
模拟请求工具Postman中提供了下面几种 post 参数格式:
- form-data
- x-www-form-urlencoded
- raw
- binary
form-data
- 这是一种特殊的POST方式,专门为HTML的表单提交设计
- 参数按照 key value 形式放在 _POST 和_REQUEST中
- 参数名中包含空格时,空格被替换为下划线
- 参数值中的特殊字符保留原样不变
- php://input 流为空
x-www-form-urlencoded 方式
- 把body按照URL解析成 key value形式放到$_POST中
- 需要添加头部:Content-Type: application/x-www-form-urlencoded
- 对输入的参数名和参数值进行URLencode的形式传输
- php://input 输入流为原始 body 值
- 该方法为特殊头部的一种 raw 方式
raw 方式:
需要注意:
- $_POST 为空
- php://input 输入流中有完整原始数据
- 可以指定各种 Content-Type,以传输 json, html, xml 等文本格式数据
binary
二级制方式用于传输文件等二进制文件,可以直接从输入流中获取。
Postman中不同的post参数测试
服务端PHP代码为:
<?php
var_dump(_GET);
var_dump(_REQUEST);
var_dump($_POST);
var_dump(file_get_contents('php://input'));
测试的PHP版本为 PHP7.6,测试工具Postman。
form-data
请求头部:
POST /params.php?username=uusama&role=admin HTTP/1.1
Host: localhost
Cache-Control: no-cache
Postman-Token: 12e89730-c04b-af7b-2e5d-d299eb5e26d2
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="body_params name oo"
test+oid%rte%20
------WebKitFormBoundary7MA4YWxkTrZu0gW--
输出结果:
G:\Projects\PHP_Projects\localhost\params.php:2:
array (size=2)
'username' => string 'uusama' (length=6)
'role' => string 'admin' (length=5)
G:\Projects\PHP_Projects\localhost\params.php:3:
array (size=3)
'username' => string 'uusama' (length=6)
'role' => string 'admin' (length=5)
'body_params_name__oo' => string 'test+oid%rte%20' (length=15)
G:\Projects\PHP_Projects\localhost\params.php:4:
array (size=1)
'body_params_name__oo' => string 'test+oid%rte%20' (length=15)
G:\Projects\PHP_Projects\localhost\params.php:5:string '' (length=0)
x-www-form-urlencoded 方式
请求头部:
POST /params.php?username=uusama&role=admin HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: 1ff7f2da-b7c4-1fbd-a105-601e54a8cc4e
body_para%7C'%22ms%2Bname++oo=test%2Boid%25rte%2520
输出结果如下:
G:\Projects\PHP_Projects\localhost\params.php:2:
array (size=2)
'username' => string 'uusama' (length=6)
'role' => string 'admin' (length=5)
G:\Projects\PHP_Projects\localhost\params.php:3:
array (size=3)
'username' => string 'uusama' (length=6)
'role' => string 'admin' (length=5)
'body_para|'"ms+name__oo' => string 'test+oid%rte%20' (length=15)
G:\Projects\PHP_Projects\localhost\params.php:4:
array (size=1)
'body_para|'"ms+name__oo' => string 'test+oid%rte%20' (length=15)
G:\Projects\PHP_Projects\localhost\params.php:5:string 'body_para%7C'%22ms%2Bname++oo=test%2Boid%25rte%2520' (length=51)
raw 方式:
请求头部:
POST /params.php?username=uusama&role=admin HTTP/1.1
Host: localhost
Cache-Control: no-cache
Postman-Token: c07c6411-7d4a-2539-1cca-4f9c77dbe43a
pawe% ram:noa_&*^(#sdwet
输出结果:
G:\Projects\PHP_Projects\localhost\params.php:2:
array (size=2)
'username' => string 'uusama' (length=6)
'role' => string 'admin' (length=5)
G:\Projects\PHP_Projects\localhost\params.php:3:
array (size=2)
'username' => string 'uusama' (length=6)
'role' => string 'admin' (length=5)
G:\Projects\PHP_Projects\localhost\params.php:4:
array (size=0)
empty
G:\Projects\PHP_Projects\localhost\params.php:5:string 'pawe% ram:noa_&*^(#sdwet' (length=27)