PHP GET/POST 请求

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-urlencodedmultipart/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变量中检索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请求。

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变量中检索namemessage参数。

$ 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

我们安装了annotmaker组件。

$ 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/slimslim/psr7slim/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教程。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏