参考
- https://www.runoob.com/http/http-methods.html
- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Overview
写这篇文章的起因,逛论坛读到一位博主的成长感悟,说他面试,被一个问题卡住了。PHP接受GET,POST请求分别$_GET,$_POST或$_REQUEST ,那么PHP如何接受PUT,PATCH,DELETE,OPTIONS请求。
引申问题PHP如何处理(接收)HTTP请求?
前置知识只是HTTP请求方法有哪些?https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods
HTTP1.0: GET POST HEAD | |
HTTP1.1: GET POST HEAD OPTIONS PUT PATCH DELETE TRACE | |
HTTP2.0: GET POST HEAD OPTIONS PUT PATCH DELETE TRACE |
PHP原生方法如何获取请求参数
$_GET,$_POST,$_REQUEST,file_get_content('php://input')
GET请求
GET query param $_GET $_REQUEST 可以获取
GET x-www-form-urlencoded php://input 可以获取
GET Form-data php://input 可以获取
GET application/json php://input 可以获取
POST请求
POST query param $_GET 和 $_REQUEST 可以获取
POST x-www-form-urlencoded $_POST $_REQUEST php://input 可以获取
POST Form-data $_POST $_REQUEST 可以获取
POST application/json php://input 可以获取
PUT 请求
PUT query-param $_GET 和 $_REQUEST 可以获取
PUT x-www-form-urlencoded php://input 可以获取
PUT form-data php://input 可以获取
PUT application/json php://input 可以获取
PATCH 请求
PATCH query-param $_GET 和 $_REQUEST 可以获取
PATCH x-www-form-urlencoded php://input 可以获取
PATCH form-data php://input 可以获取
PATCH application/json php://input 可以获取
DELETE 请求
DELETE query-param $_GET 和 $_REQUEST 可以获取
DELETE x-www-form-urlencoded php://input 可以获取
DELETE form-data php://input 可以获取
DELETE application/json php://input 可以获取
Laravel框架如何处理HTTP请求
支持的请求方法和数据交互类型
请求类型 | 支持的请求方法 | 说明 |
query param | GET,POST,PUT,DELETE,PATCH,OPTIONS | 查询字符串, 即url ? 后边的参数&和=拼接 |
url带数值 | GET,POST,PUT,DELETE,PATCH,OPTIONS通过/分割的 示例/xxx.com/user/1 1就是参数值 | 通过/分割的 示例/xxx.com/user/1 1就是参数值 |
form-data | POST | multipart/form-data 支持二进制数据上传文件必须使用此类型 |
x-www-form-urlencoded (form) | POST,PUT,DELETE,PATCH,OPTIONS | application/x-www-form-urlencoded 数据被编码成以 ‘&’ 分隔的键-值对 |
appliction/json | GET,POST,PUT,DELETE,PATCH,OPTIONS | json类型 |
获取方法
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* 存储一个新用户
*
* @param Request $request
* @return Response
*/
public function store(Request $request,$id)
{
//接受所有类型参数,无法获取上传文件
$name = $request->input('name');
//仅能接受查询字符串参数,?号后的参数
$name = $request->query('name');
//接受所有类型参数,包含上传文件,动态属性获取,触发__get()魔术方法
$name = $request->name;
//获取上传文件
$file = $request->file('file');
//同input是底层Symfony提供的方法,无法获取上传文件
$name = $request->get('name');
//获取路由参数,直接访问注入的$id变量
dump($id);
//获取原始输入数据symfony提供的方法,等于原生php的file_get_content('php://input')
$request->getContent()
}
}
原理和知识总结
- $_GET 可以获取所有类型的query param(url传参数)
- php://input 可以获取所有请求Body 的内容, 除post请求的form-data
- $_POST 可以获取POST 请求的 form-data 和 x-www-form-urlencoded
laravel使用了symfony的HTTP请求类获取去请求,底层还是通过PHP超全局变量来获取请求参数
Symfony\Component\HttpFoundation\Request
/**
* Creates a new request with values from PHP's super globals.
*
* @return static
*/
public static function createFromGlobals()
{
//使用php超全局变量获取请求数据
$request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER);
if ($_POST) {
$request->request = new InputBag($_POST);
} elseif (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
&& \in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'DELETE', 'PATCH'])
) {
parse_str($request->getContent(), $data);
$request->request = new InputBag($data);
}
return $request;
}