如何创建带纯文本请求体的Laravel Request实例
问题:如何创建带纯文本请求体的Laravel Request实例?
现有FakeController控制器的check方法需要接收JSON与纯文本请求,代码如下:
public function check(Request $request, int $twin): mixed { echo "twin = " . $twin . PHP_EOL; echo "request = " . print_r($request, true) . PHP_EOL; return null; }
使用JSON调用该方法时:
app(FakeController::class)->check(new Request($json), 123);
可成功执行并输出预期数据。但尝试用纯文本调用时:
$message = 'some text'; app(FakeController::class)->check(new Request($message), 123);
check方法无法正常获取文本内容——直接将字符串传入Request构造函数生成的实例几乎为空,未包含文本内容。需求是创建带纯文本请求体的Request实例,且不使用多用于外部调用的HttpClient。
解决方法
Laravel的Request构造函数第一个参数接收的是查询参数/表单数据,并非请求体内容。要创建带纯文本请求体的实例,需手动设置请求体内容和对应请求头:
方法一:使用Request::create()静态方法
这是官方推荐的创建请求实例的方式,可直接指定请求体和头信息:
$message = 'some text'; // 创建Request实例 $request = Request::create( '/fake/check', // 路由路径,内部调用时可随意填写 'POST', // 请求方法,根据接口实际定义选择GET/POST等 [], // URL查询参数 [], // Cookie数据 [], // 文件上传数据 ['CONTENT_TYPE' => 'text/plain'], // 请求头,指定纯文本类型 $message // 纯文本请求体内容 ); // 调用控制器方法 app(FakeController::class)->check($request, 123);
方法二:手动实例化并设置内容
若需手动构造Request对象,可通过setContent()方法设置请求体,并指定Content-Type头:
$message = 'some text'; $request = new Request(); // 设置纯文本请求体内容 $request->setContent($message); // 设置请求头为纯文本类型 $request->headers->set('Content-Type', 'text/plain'); // 调用控制器方法 app(FakeController::class)->check($request, 123);
控制器中获取纯文本内容
纯文本请求体不会被Laravel自动解析为输入参数,需通过getContent()方法获取:
public function check(Request $request, int $twin): mixed { echo "twin = " . $twin . PHP_EOL; // 获取纯文本请求体 echo "request body: " . $request->getContent() . PHP_EOL; return null; }
内容的提问来源于stack exchange,提问作者vbulash
相关产品推荐
相关产品推荐

