6.8 PSR-18 HTTP Client¶
PSR-18 merupakan standar interface untuk library client HTTP di PHP. Standar ini bertujuan untuk menyederhanakan proses interaksi dengan server HTTP dan memfasilitasi interoperabilitas antar library client HTTP yang berbeda. Dengan mengikuti PSR-18, diharapkan dapat menciptakan aplikasi yang lebih terstruktur, mudah dipelihara, dan dapat berinteraksi dengan berbagai komponen lainnya dengan lebih baik.
6.8.1 Prinsip Dasar PSR-18:¶
-
Interface client
Mendefinisikan interface
Psr\Http\Client\ClientInterface
yang harus diimplementasikan oleh semua library client HTTP. Interface ini menyediakan metode untuk membuat dan mengirim permintaan HTTP, serta menerima dan memproses respons HTTP. -
Permintaan HTTP
Mendefinisikan interface
Psr\Http\Message\RequestInterface
untuk mewakili permintaan HTTP. Interface ini menyediakan metode untuk mendapatkan informasi tentang permintaan, seperti URL, metode HTTP, header, dan badan permintaan -
Response HTTP
Mendefinisikan interface
Psr\Http\Message\ResponseInterface
untuk mewakili respons HTTP. Interface ini menyediakan metode untuk mendapatkan informasi tentang respons, seperti status code, header, dan badan respons. -
Stream Pesan:
Mendukung penggunaan stream untuk membaca dan menulis badan pesan HTTP.
Contoh Implementasi PSR-18 dalam kode:
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
class MyHttpClient implements ClientInterface
{
public function sendRequest(RequestInterface $request): Promise
{
// Buat dan kirim permintaan HTTP
$curl = curl_init($request->getUri()->__toString());
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getMethod());
curl_setopt($curl, CURLOPT_HTTPHEADER, $request->getHeaders());
curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getBody()->getContents());
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
curl_close($curl);
// Buat dan kembalikan Promise untuk respons HTTP
$promise = new Promise(function ($resolve, $reject) use ($response) {
if ($response === false) {
$reject(new Exception('CURL error: ' . curl_error($curl)));
return;
}
$statusLine = trim(fgets($response));
$statusCode = (int) explode(' ', $statusLine)[1];
$headers = [];
while (($line = fgets($response)) !== false) {
if (strlen(trim($line)) === 0) {
break;
}
$parts = explode(':', $line, 2);
$headers[trim($parts[0])] = trim($parts[1]);
}
$responseBody = stream_get_contents($response);
$httpResponse = new Response($statusCode, $headers, $responseBody);
$resolve($httpResponse);
});
return $promise;
}
}
// Contoh penggunaan
$httpClient = new MyHttpClient();
$request = new Request('GET', 'https://example.com');
$promise = $httpClient->sendRequest($request);
$promise->then(function (ResponseInterface $response) {
echo "Status code: " . $response->getStatusCode() . "\n";
echo "Content: " . $response->getBody()->getContents() . "\n";
});
6.8.2 Manfaat¶
Adapun manfaat dari penerapan PSR-18 adalah sebagai berikut:
- Meningkatkan keterbacaan dan organisasi kode HTTP karena telah konsisten sesuai standar.
- Mempermudah integrasi dengan library HTTP pihak ketiga selama mengikuti interface yang sama.
- Memisahkan logika HTTP dari aplikasi sehingga dapat digunakan oleh class lainnya dalam satu aplikasi.
- Mendukung pengujian unit dan integrasi yang lebih mudah.
6.8.3 Kelemahan¶
Meskipun disarankan untuk menggunakan PSR-18, namun PSR-18 masih memiliki beberapa kendal, antar lain:
- Standar ini masih tergolong baru dan belum diadopsi secara luas.
- Beberapa library HTTP populer belum mendukung PSR-18 secara penuh.
- Implementasi PSR-18 yang berbeda mungkin memiliki cara kerja yang berbeda.