• 认真地记录技术中遇到的坑!

PHP处理HTTP请求参数

PHP 悠悠 2年前 (2017-12-02) 1475次浏览 0个评论

我们一般使用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)

转载请注明出处 PHP处理HTTP请求参数
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址