ZetCode

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 请求

HTTP POST

HTTP POST 方法将数据发送到服务器。它通常用于上传文件或提交完成的 Web 表单。

POST 请求

PHP $_GET 和 $_POST

PHP 提供了 $_GET$_POST 超全局变量。 $_GET 是一个关联数组,用于存储通过 URL 参数(查询字符串)传递给当前脚本的变量。 $_POST 也是一个关联数组,用于存储在使用 application/x-www-form-urlencodedmultipart/form-data 作为请求中的 HTTP Content-Type 的情况下,通过 HTTP POST 方法传递给当前脚本的变量。

PHP GET 请求

在下面的例子中,我们使用 curl 工具生成一个 GET 请求,并在纯 PHP 中处理该请求。

get_req.php
<?php

$name = $_GET['name'];

if ($name == null) {
    $name = 'guest';
}

$message = $_GET['message'];

if ($message == null) {
    $message = 'hello there';
}

echo "$name says: $message";

该示例从 $_GET 变量中检索 namemessage 参数。

$ 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 中处理该请求。

post_req.php
<?php

$name = $_POST['name'];

if ($name == null) {
    $name = 'guest';
}

$message = $_POST['message'];

if ($message == null) {
    $message = 'hello there';
}


echo "$name says: $message";

该示例从 $_POST 变量中检索 namemessage 参数。

$ 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 组件。

send_get_req.php
<?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 请求。

send_post_req.php
<?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

我们安装 annotmaker 组件。

$ php bin/console make:controller HomeController

我们创建一个新的控制器。

src/Controller/HomeController.php
<?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']);
    }
}

HomeControllerindex 方法中,我们获取查询参数并创建一个响应。

$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 请求。

src/Controller/HomeController.php
<?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/slimslim/psr7slim/http 包。

public/index.php
<?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 请求。

public/index.php
<?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 应用程序。

routes/web.php
<?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 请求。

resources/views/home.blade.php
<!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 保护。

routes/web.php
<?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 语言参考

在本文中,我们使用了纯 PHP、Symfony、Slim 和 Laravel 中的 GET 和 POST 请求。

作者

我叫 Jan Bodnar,是一位经验丰富的程序员,对编程有丰富的经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 PHP 教程。