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