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 教程。