PHP GET/POST 请求
最后修改于 2025 年 2 月 16 日
PHP GET/POST 请求教程演示了如何在 PHP 中生成和处理 GET 和 POST 请求。 我们使用纯 PHP 以及 Symfony、Slim 和 Laravel 框架。
HTTP
超文本传输协议(Hypertext Transfer Protocol (HTTP))是一种用于分布式、协作式、超媒体信息系统的应用层协议。HTTP 协议是万维网数据通信的基础。
HTTP GET
HTTP GET 方法请求指定资源的表示形式。
GET 请求
- 仅应用于请求资源
- 参数显示在 URL 中
- 可以被缓存
- 保留在浏览器历史记录中
- 可以被添加书签
- 在处理敏感数据时绝不应使用
- 具有长度限制
HTTP POST
HTTP POST 方法将数据发送到服务器。它通常用于上传文件或提交完成的 Web 表单。
POST 请求
- 应用于创建资源
- 参数不会显示在 URL 中
- 从不缓存
- 不会保留在浏览器历史记录中
- 无法被书签标记
- 可用于处理敏感数据
- 没有长度限制
PHP $_GET 和 $_POST
PHP 提供了 $_GET
和 $_POST
超全局变量。 $_GET
是一个关联数组,用于存储通过 URL 参数(查询字符串)传递给当前脚本的变量。 $_POST
也是一个关联数组,用于存储在使用 application/x-www-form-urlencoded
或 multipart/form-data
作为请求中的 HTTP Content-Type 的情况下,通过 HTTP POST 方法传递给当前脚本的变量。
PHP GET 请求
在下面的例子中,我们使用 curl 工具生成一个 GET 请求,并在纯 PHP 中处理该请求。
<?php $name = $_GET['name']; if ($name == null) { $name = 'guest'; } $message = $_GET['message']; if ($message == null) { $message = 'hello there'; } echo "$name says: $message";
该示例从 $_GET
变量中检索 name
和 message
参数。
$ php -S localhost:8000 get_req.php
我们启动服务器。
$ curl 'localhost:8000/?name=Lucia&message=Cau' Lucia says: Cau $ curl 'localhost:8000/?name=Lucia' Lucia says: hello there
我们使用 curl 发送两个 GET 请求。
PHP POST 请求
在下面的例子中,我们使用 curl 工具生成一个 POST 请求,并在纯 PHP 中处理该请求。
<?php $name = $_POST['name']; if ($name == null) { $name = 'guest'; } $message = $_POST['message']; if ($message == null) { $message = 'hello there'; } echo "$name says: $message";
该示例从 $_POST
变量中检索 name
和 message
参数。
$ php -S localhost:8000 post_req.php
我们启动服务器。
$ curl -d "name=Lucia&message=Cau" localhost:8000 Lucia says: Cau
我们使用 curl 发送一个 POST 请求。
使用 Symfony HttpClient 在 PHP 中发送 GET 请求
Symfony 提供了 HttpClient
组件,使我们能够在 PHP 中创建 HTTP 请求。
$ composer req symfony/http-client
我们安装 symfony/http-client
组件。
<?php require('vendor/autoload.php'); use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(); $response = $httpClient->request('GET', 'https://:8000', [ 'query' => [ 'name' => 'Lucia', 'message' => 'Cau', ] ]); $content = $response->getContent(); echo $content . "\n";
该示例向 localhost:8000/get_request.php
发送一个包含两个查询参数的 GET 请求。
$ php -S localhost:8000 get_req.php
我们启动服务器。
$ php send_get_req.php Lucia says: Cau
我们运行 send_get_req.php
脚本。
使用 Symfony HttpClient 在 PHP 中发送 POST 请求
在下面的例子中,我们使用 Symfony HttpClient 发送一个 POST 请求。
<?php require('vendor/autoload.php'); use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(); $response = $httpClient->request('POST', 'https://:8000', [ 'body' => [ 'name' => 'Lucia', 'message' => 'Cau', ] ]); $content = $response->getContent(); echo $content . "\n";
该示例向 localhost:8000/post_req.php
发送一个包含两个参数的 POST 请求。
$ php -S localhost:8000 post_req.php
我们启动服务器。
$ php send_post_req.php Lucia says: Cau
我们运行 send_post_req.php
脚本。
在 Symfony 中进行 PHP GET 请求
在下面的例子中,我们在 Symfony 应用程序中处理一个 GET 请求。
$ symfony new symreq $ cd symreq
创建一个新的应用程序。
$ composer req annot $ composer req maker --dev
我们安装 annot
和 maker
组件。
$ php bin/console make:controller HomeController
我们创建一个新的控制器。
<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Request; class HomeController extends AbstractController { /** * @Route("/", name="home", methods={"GET"}) */ public function index(Request $request): Response { $name = $request->query->get('name', 'guest'); $message = $request->query->get('message', 'hello there'); $output = "$name says: $message"; return new Response($output, Response::HTTP_OK, ['content-type' => 'text/plain']); } }
在 HomeController
的 index
方法中,我们获取查询参数并创建一个响应。
$name = $request->query->get('name', 'guest');
使用 $request->query->get
检索 GET 参数。 该方法的第二个参数是默认值,在未检索到值时使用。
$ symfony serve
我们启动服务器。
$ curl 'localhost:8000/?name=Lucia&message=Cau' Lucia says: Cau
我们使用 curl 生成一个 GET 请求。
在 Symfony 中进行 PHP POST 请求
在下面的例子中,我们在 Symfony 应用程序中处理一个 POST 请求。
<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Request; class HomeController extends AbstractController { /** * @Route("/", name="home", methods={"POST"}) */ public function index(Request $request): Response { $name = $request->request->get('name', 'guest'); $message = $request->request->get('message', 'hello there'); $output = "$name says: $message"; return new Response($output, Response::HTTP_OK, ['content-type' => 'text/plain']); } }
我们更改控制器以处理 POST 请求。
$name = $request->request->get('name', 'guest');
使用 $request->request->get
检索 POST 参数。 该方法的第二个参数是默认值,在未检索到值时使用。
$ symfony serve
我们启动服务器。
$ curl -d "name=Lucia" localhost:8000 Lucia says: hello there
我们使用 curl 生成一个 POST 请求。
在 Slim 中进行 PHP GET 请求
在下面的例子中,我们将在 Slim 框架中处理一个 GET 请求。
$ composer req slim/slim $ composer req slim/psr7 $ composer req slim/http
我们安装 slim/slim
、slim/psr7
和 slim/http
包。
<?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php'; $app = AppFactory::create(); $app->get('/', function (Request $request, Response $response): Response { $name = $request->getQueryParam('name', 'guest'); $message = $request->getQueryParam('message', 'hello there'); $output = "$name says $message"; $response->getBody()->write($output); return $response; }); $app->run();
我们在 Slim 中获取参数并返回一个响应。
$name = $request->getQueryParam('name', 'guest');
使用 getQueryParam
检索查询参数;第二个参数是默认值。
$response->getBody()->write($output);
我们使用 write
将输出写入响应主体。
$ php -S localhost:8000 -t public
我们启动服务器。
$ curl 'localhost:8000/?name=Lucia&message=Cau' Lucia says: Cau
我们使用 curl 生成一个 GET 请求。
在 Slim 中进行 PHP POST 请求
在下面的例子中,我们将在 Slim 框架中处理一个 POST 请求。
<?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php'; $app = AppFactory::create(); $app->post('/', function (Request $request, Response $response): Response { $data = $request->getParsedBody(); $name = $data['name']; $message = $data['message']; if ($name == null) { $name = 'guest'; } if ($message == null) { $message = 'hello there'; } $output = "$name says: $message"; $response->getBody()->write($output); return $response; }); $app->run();
我们在 Slim 中获取 POST 参数并返回一个响应。
$data = $request->getParsedBody();
使用 getParsedBody
检索 POST 参数。
$ php -S localhost:8000 -t public
我们启动服务器。
$ curl -d "name=Lucia" localhost:8000 Lucia says: hello there
我们使用 curl 生成一个 POST 请求。
在 Laravel 中进行 PHP GET 请求
在下面的例子中,我们在 Laravel 中处理一个 GET 请求。
$ laravel new larareq $ cd larareq
我们创建一个新的 Laravel 应用程序。
<?php use Illuminate\Support\Facades\Route; use Illuminate\Http\Request; Route::get('/', function (Request $request) { $name = $request->query('name', 'guest'); $message = $request->query('message', 'hello there'); $output = "$name says $message"; return $output; });
我们获取 GET 参数并创建一个响应。
$ php artisan serve
我们启动服务器。
$ curl 'localhost:8000/?name=Lucia&message=Cau' Lucia says Cau
我们使用 curl 发送一个 GET 请求。
在 Laravel 中进行 PHP POST 请求
在下面的例子中,我们从一个 HTML 表单发送一个 POST 请求。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Home page</title> <style> .alert { color: red} </style> </head> <body> @if ($errors->any()) <div class="alert"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <form action="process_form" method="post"> @csrf <label for="name">Name</label> <input id="name" value="{{old('name')}}"type="text" name="name"> <label for="message">Message</label> <input id="message" value="{{old('message')}}" type="text" name="message"> <button type="submit">Submit</button> </form> </body> </html>
我们在 Blade 模板中有一个 POST 表单。 Laravel 需要对 POST 请求进行 CSRF 保护。 我们使用 @csrf
启用 CSRF 保护。
<?php use Illuminate\Support\Facades\Route; use Illuminate\Http\Request; Route::get('/', function () { return view('home'); }); Route::post('/process_form', function (Request $request) { $request->validate([ 'name' => 'required|min:2', 'message' => 'required|min:3' ]); $name = $request->input('name'); $message = $request->input('message'); $output = "$name says: $message"; return $output; });
我们验证并检索 POST 参数,并将它们发送到响应中。 这个例子应该在浏览器中进行测试。
来源
在本文中,我们使用了纯 PHP、Symfony、Slim 和 Laravel 中的 GET 和 POST 请求。
作者
列出所有 PHP 教程。