Koded HTTP library implements PSR-7 (HTTP message), PSR-17 (HTTP Factories) and PSR-18 (HTTP Client).
To have more useful everyday methods for your projects, the request and response instances are extended with additional interfaces.
class ServerRequest extends ClientRequest implements Request {}This object represents the incoming server-side HTTP request.
class ClientRequest implements RequestInterface, JsonSerializable {}This object is a representation of an outgoing client-side HTTP request.
class ServerResponse implements Response, JsonSerializable {}This object represents the outgoing server-side response.
This value object represents a file uploaded through the HTTP request.
Implementation of PSR-17 (HTTP Factories).
<?php
use Koded\Http\HttpFactory;
$httpFactory = new HttpFactory;
$clientRequest = $httpFactory->createRequest('GET', '/');
$serverRequest = $httpFactory->createServerRequest('GET', '/');
$response = $httpFactory->createResponse(201);
$stream = $httpFactory->createStream('Hello there');
$stream = $httpFactory->createStreamFromFile('file.name', '+w');
$stream = $httpFactory->createStreamFromResource($resource);
$uri = $httpFactory->createUri('/');
$uploadedFile = $httpFactory->createUploadedFile($stream);There are 2 implementations for ClientRequest interface
- PHP stream
- curl
To create instances of HTTP clients, use the Koded\Http\Client\ClientFactory class
<?php
use Koded\Http\Client\ClientFactory;
$http = new ClientFactory(ClientFactory::CURL); // or ClientFactory::PHP
$http->get('/', $headers);
$http->post('/', $body, $headers);
$http->put('/', $body, $headers);
$http->patch('/', $body, $headers);
$http->delete('/', $headers);
$http->head('/', $headers);$headers are optional.
Implementation of PSR-18 (HTTP Client).
<?php
use Koded\Http\Client\ClientFactory;
use Koded\Http\ClientRequest;
$request = new ClientRequest('POST', 'https://...', ['foo' => 'bar']);
$response = (new ClientFactory)->sendRequest($request);Koded\Http\RequestKoded\Http\Response
These two may be useful in your project as they provide additional methods for request/response objects state.
getPath(): stringgetBaseUri(): stringwithAttributes(array $attributes): RequestisSecure(): boolisSafeMethod(): boolisXHR(): bool
getContentType(): string
Both Request and Response extends this interface, thus providing the extra methods:
withHeaders(array $headers): staticreplaceHeaders(array $headers): staticgetFlattenedHeaders(): arraygetCanonicalizedHeaders(array $names = []): string
The idea here is to have a basic mechanism for validating the incoming request data.
Validation is done in an instance of HttpInputValidator object by calling the
Request::validate(HttpInputValidator $validator) method.
HttpInputValidator::validate() should return array, in case of
- empty array, the validation went fine
- a hash (
['key' => 'value', ...]), with information what went wrong if incoming data is not valid
The error handling is done in the application. A naive example:
class FormValidator implements HttpInputValidator {
public function validate(Data $input): array {
if (empty($input->get('username'))) {
return ['message' => 'Username is required'];
}
return [];
}
}
// Somewhere in your app, use the `Request` object to run validation
if ($response = $request->validate(new FormValidator)) {
// {"message":"Username is required","status":400}
return $response;
}The error response will always have a status code set (status value) in the error message.
If the status code is not provided in the validation, the default is 400 Bad Request.
The code is distributed under the terms of The 3-Clause BSD license.





