PHP 语言 使用PSR 149标准实现HTTP消息发送器

PHP阿木 发布于 2025-07-01 22 次阅读


摘要:

随着互联网技术的不断发展,HTTP协议已成为现代网络通信的基础。PHP作为一门流行的服务器端脚本语言,在处理HTTP请求和响应方面有着广泛的应用。PSR-149标准是PHP社区为了提高代码质量和可维护性而制定的一系列规范。本文将围绕PSR-149标准,探讨如何使用PHP实现一个符合规范的HTTP消息发送器。

一、

HTTP消息发送器是PHP中用于发送HTTP请求和接收响应的组件。在PHP中,实现HTTP消息发送器有多种方式,如使用cURL、file_get_contents等函数。这些方法往往缺乏一致性,难以维护。为了提高PHP代码的质量和可维护性,PSR-149标准应运而生。

PSR-149标准定义了HTTP客户端接口,旨在提供一个统一的接口,使得开发者可以方便地发送HTTP请求和接收响应。本文将基于PSR-149标准,使用PHP实现一个简单的HTTP消息发送器。

二、PSR-149标准概述

PSR-149标准定义了以下接口:

1. HttpFactoryInterface:用于创建HTTP客户端实例。

2. HttpClientInterface:用于发送HTTP请求和接收响应。

3. RequestInterface:表示HTTP请求。

4. ResponseInterface:表示HTTP响应。

三、实现HTTP消息发送器

1. 创建HttpFactoryInterface实现类

php

<?php


namespace Http;

use PsrHttpClientHttpClientInterface;

class HttpFactory implements HttpFactoryInterface


{


public function createHttpClient(): HttpClientInterface


{


// 创建并返回一个符合HttpClientInterface的HTTP客户端实例


return new HttpClient();


}


}


2. 创建HttpClientInterface实现类

php

<?php


namespace Http;

use PsrHttpClientClientExceptionInterface;


use PsrHttpClientClientInterface;


use PsrHttpMessageRequestInterface;


use PsrHttpMessageResponseInterface;

class HttpClient implements HttpClientInterface


{


public function sendRequest(RequestInterface $request): ResponseInterface


{


// 使用cURL或其他HTTP客户端库发送请求并返回响应


$curl = curl_init();


curl_setopt($curl, CURLOPT_URL, $request->getUri());


curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);


curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getMethod());


curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getBody());

// 设置请求头


foreach ($request->getHeaders() as $name => $values) {


curl_setopt($curl, CURLOPT_HTTPHEADER, array_merge(


curl_getopt($curl, CURLOPT_HTTPHEADER),


array($name . ': ' . implode(', ', $values))


));


}

$responseBody = curl_exec($curl);


$responseHeaders = curl_getinfo($curl);


curl_close($curl);

// 创建并返回响应对象


return new Response($responseBody, $responseHeaders);


}


}


3. 创建RequestInterface实现类

php

<?php


namespace Http;

use PsrHttpMessageRequestInterface;


use PsrHttpMessageUriInterface;

class Request implements RequestInterface


{


private $method;


private $uri;


private $body;


private $headers;

public function __construct(string $method, UriInterface $uri, string $body = '', array $headers = [])


{


$this->method = $method;


$this->uri = $uri;


$this->body = $body;


$this->headers = $headers;


}

public function getMethod(): string


{


return $this->method;


}

public function getUri(): UriInterface


{


return $this->uri;


}

public function withMethod($method): RequestInterface


{


// 实现方法...


}

public function withUri(UriInterface $uri, $preserveHost = false): RequestInterface


{


// 实现方法...


}

public function getBody(): string


{


return $this->body;


}

public function withBody($body): RequestInterface


{


// 实现方法...


}

public function getHeaders(): array


{


return $this->headers;


}

public function hasHeader($name): bool


{


// 实现方法...


}

public function getHeader($name): array


{


// 实现方法...


}

public function getHeaderLine($name): string


{


// 实现方法...


}

public function withHeader($name, $value): RequestInterface


{


// 实现方法...


}

public function withoutHeader($name): RequestInterface


{


// 实现方法...


}


}


4. 创建ResponseInterface实现类

php

<?php


namespace Http;

use PsrHttpMessageResponseInterface;

class Response implements ResponseInterface


{


private $body;


private $headers;


private $statusCode;


private $reasonPhrase;

public function __construct(string $body, array $headers, int $statusCode = 200, string $reasonPhrase = '')


{


$this->body = $body;


$this->headers = $headers;


$this->statusCode = $statusCode;


$this->reasonPhrase = $reasonPhrase;


}

public function getBody(): string


{


return $this->body;


}

public function withBody($body): ResponseInterface


{


// 实现方法...


}

public function getHeaders(): array


{


return $this->headers;


}

public function hasHeader($name): bool


{


// 实现方法...


}

public function getHeader($name): array


{


// 实现方法...


}

public function getHeaderLine($name): string


{


// 实现方法...


}

public function withHeader($name, $value): ResponseInterface


{


// 实现方法...


}

public function withoutHeader($name): ResponseInterface


{


// 实现方法...


}

public function getStatusCode(): int


{


return $this->statusCode;


}

public function withStatus($code, $reasonPhrase = ''): ResponseInterface


{


// 实现方法...


}

public function getReasonPhrase(): string


{


return $this->reasonPhrase;


}


}


四、使用HTTP消息发送器

php

<?php


namespace App;

use HttpHttpFactory;


use HttpHttpClientInterface;


use HttpRequest;

class HttpSender


{


private $httpClient;

public function __construct(HttpClientInterface $httpClient)


{


$this->httpClient = $httpClient;


}

public function send(string $method, string $uri, array $headers = [], string $body = '')


{


$request = new Request($method, $uri, $body, $headers);


$response = $this->httpClient->sendRequest($request);


return $response;


}


}

// 使用示例


$factory = new HttpFactory();


$httpClient = $factory->createHttpClient();


$sender = new HttpSender($httpClient);

$response = $sender->send('GET', 'http://example.com');


echo $response->getBody();


五、总结

本文基于PSR-149标准,使用PHP实现了一个简单的HTTP消息发送器。通过遵循PSR-149标准,我们可以提高代码的质量和可维护性,方便后续的开发和维护。在实际项目中,可以根据需求对HTTP消息发送器进行扩展和优化,以满足不同的业务场景。