下面给你一份 ThinkPHP5 中 Request 请求对象最完整实战大全(含常用方法 + 进阶用法 + 安全注意点)。


一、Request 对象是什么?

ThinkPHP 5 中,Request 是用于获取:

  • GET / POST 参数
  • 路由参数
  • 请求类型
  • 请求头
  • IP 地址
  • 域名
  • 文件上传
  • JSON 数据
  • 服务器环境变量

的核心对象。


二、获取 Request 实例

方法 1:控制器中自动注入(推荐)

use think\Request;

public function index(Request $request)
{
    dump($request->param());
}


方法 2:静态方式

$request = request();


三、获取请求参数


1️⃣ 获取所有参数

$request->param();

等价于:

input();


2️⃣ 获取 GET 参数

$request->get();
$request->get('id');

指定默认值:

$request->get('id', 0);


3️⃣ 获取 POST 参数

$request->post();
$request->post('username');


4️⃣ 获取路由参数

$request->route();
$request->route('id');


5️⃣ 获取 PUT / DELETE

$request->put();
$request->delete();


6️⃣ 只获取指定字段

$request->only(['id','name']);

排除字段:

$request->except(['password']);


四、参数过滤与类型转换(重点)


1️⃣ 强制类型转换

$request->param('id/d');

常用类型:

类型写法
int/d
float/f
string/s
bool/b

例子:

$id = $request->param('id/d', 0);


2️⃣ 过滤 HTML

$request->param('name','','htmlspecialchars');


3️⃣ 全局过滤

config.php:

'default_filter' => 'htmlspecialchars'


五、判断请求类型


判断是否 POST

$request->isPost();


判断是否 GET

$request->isGet();


判断是否 AJAX

$request->isAjax();


判断是否 HTTPS

$request->isSsl();


六、获取请求信息


获取 IP

$request->ip();


获取域名

$request->domain();


获取当前 URL

$request->url();

带域名:

$request->url(true);


获取当前模块 / 控制器 / 方法

$request->module();
$request->controller();
$request->action();


七、获取 Header 信息


获取所有 Header

$request->header();


获取指定 Header

$request->header('User-Agent');


八、获取原始请求内容


获取 raw 数据

$request->getContent();

用于处理 JSON:

$data = json_decode($request->getContent(), true);


九、文件上传


获取上传文件

$file = $request->file('image');


保存文件

$file->move(ROOT_PATH . 'public/uploads');


多文件上传

$files = $request->file('images');
foreach ($files as $file) {
    $file->move(...);
}


十、JSON 请求处理

当前端发送:

{
    "name":"小明",
    "age":18
}

处理方式:

$data = json_decode($request->getContent(), true);


十一、获取服务器环境变量


$request->server();
$request->server('HTTP_HOST');


十二、获取 Cookie


$request->cookie();
$request->cookie('token');


十三、获取 Session


session('user_id');

或:

$request->session('user_id');


十四、参数优先级规则

param() 的优先级:

route > GET > POST


十五、安全建议(生产必须)


✅ 永远不要直接信任 param()

错误:

$id = $request->param('id');

正确:

$id = $request->param('id/d', 0);


✅ 过滤 XSS

htmlspecialchars


✅ 验证器配合使用

validate([
    'id' => 'require|number',
])->check($request->param());


十六、完整示例控制器

use think\Controller;
use think\Request;

class User extends Controller
{
    public function save(Request $request)
    {
        if (!$request->isPost()) {
            return json(['error'=>'Invalid request']);
        }

        $data = $request->only(['name','age']);

        $data['age'] = $request->param('age/d');

        return json([
            'ip' => $request->ip(),
            'data' => $data
        ]);
    }
}


十七、常见问题


param() 和 input() 区别?

本质一样,input() 是助手函数。


为什么获取不到 JSON?

必须用:

$request->getContent();


为什么 Ajax 判断失败?

检查 Header:

X-Requested-With


十八、总结结构图

Request 可获取:

参数类
请求类型
请求头
IP / 域名
文件
JSON
环境变量


如果你需要

我可以给你:

  • 🔥 ThinkPHP5 全局安全加固方案
  • 🔥 TP5 + JWT 接口封装标准模板
  • 🔥 企业级 API 统一响应结构
  • 🔥 TP5 与 TP6 区别对照表

你现在是做 API 还是传统页面?我可以给你针对性最佳实践方案。