PHPGET/POST请求教程展示了如何在PHP中生成和处理GET和POST请求。我们使用纯PHP和Symfony、Slim和Laravel框架。
$ php -v php -v PHP 8.1.2 (cli) (built: Aug 8 2022 07:28:23) (NTS) ...
我们使用PHP版本8.1.2。
HTTP
超文本传输协议(HTTP)是分布式协作超媒体信息系统的应用协议。HTTP协议是万维网数据通信的基础。
HTTP获取
HTTPGET方法请求指定资源的表示。
GET请求:
- 应该只用于请求资源
- 参数显示在URL中
- 可以缓存
- 保留在浏览器历史中
- 可以添加书签
- 在处理敏感数据时绝不能使用
- 有长度限制
HTTP发送
HTTPPOST方法向服务器发送数据。它通常在上传文件或提交完整的网络表单时使用。
POST请求:
- 应该用于创建资源
- 参数不显示在URL中
- 从不缓存
- 不保留在浏览器中history
- 不能加书签
- 处理敏感数据时可以使用
- 没有长度限制
PHP$_GET和$_POST
PHP提供了$_GET
和$_POST
超全局变量。$_GET
是通过URL参数(查询字符串)传递给当前脚本的变量的关联数组。$_POST
是在使用application/x-www-form-urlencoded
或multipart/form时通过HTTPPOST方法传递给当前脚本的变量的关联数组-data
作为请求中的HTTPContent-Type。
PHPGET请求
在下面的示例中,我们使用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请求。
PHPPOST请求
在下面的示例中,我们使用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请求。
PHP使用SymfonyHttpClient发送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', 'http://localhost:8000', [ 'query' => [ 'name' => 'Lucia', 'message' => 'Cau', ] ]); $content = $response->getContent(); echo $content . "\n";
该示例将带有两个查询参数的GET请求发送到localhost:8000/get_request.php
。
$ php -S localhost:8000 get_req.php
我们启动服务器。
$ php send_get_req.php Lucia says: Cau
我们运行send_get_req.php
脚本。
PHP使用SymfonyHttpClient发送POST请求
在下面的示例中,我们使用SymfonyHttpClient发送POST请求。
<?php require('vendor/autoload.php'); use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(); $response = $httpClient->request('POST', 'http://localhost:8000', [ 'body' => [ 'name' => 'Lucia', 'message' => 'Cau', ] ]); $content = $response->getContent(); echo $content . "\n";
该示例将带有两个参数的POST请求发送到localhost:8000/post_req.php
。
$ php -S localhost:8000 post_req.php
我们启动服务器。
$ php send_post_req.php Lucia says: Cau
我们运行send_post_req.php
脚本。
Symfony中的PHPGET请求
在下面的示例中,我们在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');
GET参数通过$request->query->get
获取。该方法的第二个参数是默认值,在没有检索到值时使用。
$ symfony serve
我们启动服务器。
$ curl 'localhost:8000/?name=Lucia&message=Cau' Lucia says: Cau
我们使用curl生成GET请求。
Symfony中的PHPPOST请求
在下面的示例中,我们在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');
POST参数通过$request->request->get
获取。该方法的第二个参数是默认值,在没有检索到值时使用。
$ symfony serve
我们启动服务器。
$ curl -d "name=Lucia" localhost:8000 Lucia says: hello there
我们使用curl生成一个POST请求。
Slim中的PHPGET请求
在下面的例子中,我们将在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中的PHPPOST请求
在下面的例子中,我们将在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();
我们获取POST参数并在Slim中返回响应。
$data = $request->getParsedBody();
使用getParsedBody
检索POST参数。
$ php -S localhost:8000 -t public
我们启动服务器。
$ curl -d "name=Lucia" localhost:8000 Lucia says: hello there
我们使用curl生成一个POST请求。
Laravel中的PHPGET请求
在下面的例子中,我们在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中的PHPPOST请求
在下面的示例中,我们从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教程。