Saya ingin menambahkan beberapa pemikiran tentang jawaban berbasis ikal dari Fred Tanrikut. Saya tahu sebagian besar dari mereka sudah ditulis dalam jawaban di atas, tetapi saya pikir itu ide yang baik untuk menunjukkan jawaban yang mencakup semuanya.
Berikut ini adalah kelas yang saya tulis untuk membuat permintaan HTTP-GET / POST / PUT / DELETE berdasarkan curl, mengenai hampir semua tubuh respons:
class HTTPRequester {
/**
* @description Make HTTP-GET call
* @param $url
* @param array $params
* @return HTTP-Response body or an empty string if the request fails or is empty
*/
public static function HTTPGet($url, array $params) {
$query = http_build_query($params);
$ch = curl_init($url.'?'.$query);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
/**
* @description Make HTTP-POST call
* @param $url
* @param array $params
* @return HTTP-Response body or an empty string if the request fails or is empty
*/
public static function HTTPPost($url, array $params) {
$query = http_build_query($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
/**
* @description Make HTTP-PUT call
* @param $url
* @param array $params
* @return HTTP-Response body or an empty string if the request fails or is empty
*/
public static function HTTPPut($url, array $params) {
$query = \http_build_query($params);
$ch = \curl_init();
\curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
\curl_setopt($ch, \CURLOPT_HEADER, false);
\curl_setopt($ch, \CURLOPT_URL, $url);
\curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'PUT');
\curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
$response = \curl_exec($ch);
\curl_close($ch);
return $response;
}
/**
* @category Make HTTP-DELETE call
* @param $url
* @param array $params
* @return HTTP-Response body or an empty string if the request fails or is empty
*/
public static function HTTPDelete($url, array $params) {
$query = \http_build_query($params);
$ch = \curl_init();
\curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
\curl_setopt($ch, \CURLOPT_HEADER, false);
\curl_setopt($ch, \CURLOPT_URL, $url);
\curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'DELETE');
\curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
$response = \curl_exec($ch);
\curl_close($ch);
return $response;
}
}
Perbaikan
- Menggunakan http_build_query untuk mengeluarkan kueri-string dari array-permintaan. (Anda juga bisa menggunakan array itu sendiri, oleh karena itu lihat: http://php.net/manual/en/function.curl-setopt.php )
- Mengembalikan respons alih-alih menggemakannya. Btw Anda bisa menghindari pengembalian dengan menghapus baris curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true);. Setelah itu, nilai baliknya adalah boolean (true = permintaan berhasil jika tidak terjadi kesalahan) dan respons diulang. Lihat: http://php.net/en/manual/function.curl-exec.php
- Bersihkan penutupan sesi dan penghapusan curl-handler dengan menggunakan curl_close . Lihat: http://php.net/manual/en/function.curl-close.php
- Menggunakan nilai boolean untuk curl_setopt fungsi daripada menggunakan angka apa pun. (Saya tahu bahwa angka apa pun yang tidak sama dengan nol juga dianggap benar, tetapi penggunaan true menghasilkan kode yang lebih mudah dibaca, tapi itu hanya pendapat saya)
- Kemampuan untuk melakukan panggilan HTTP-PUT / DELETE (berguna untuk pengujian layanan RESTful)
Contoh penggunaan
DAPATKAN
$response = HTTPRequester::HTTPGet("http://localhost/service/foobar.php", array("getParam" => "foobar"));
POS
$response = HTTPRequester::HTTPPost("http://localhost/service/foobar.php", array("postParam" => "foobar"));
TARUH
$response = HTTPRequester::HTTPPut("http://localhost/service/foobar.php", array("putParam" => "foobar"));
MENGHAPUS
$response = HTTPRequester::HTTPDelete("http://localhost/service/foobar.php", array("deleteParam" => "foobar"));
Pengujian
Anda juga dapat membuat beberapa tes layanan keren dengan menggunakan kelas sederhana ini.
class HTTPRequesterCase extends TestCase {
/**
* @description test static method HTTPGet
*/
public function testHTTPGet() {
$requestArr = array("getLicenses" => 1);
$url = "http://localhost/project/req/licenseService.php";
$this->assertEquals(HTTPRequester::HTTPGet($url, $requestArr), '[{"error":false,"val":["NONE","AGPL","GPLv3"]}]');
}
/**
* @description test static method HTTPPost
*/
public function testHTTPPost() {
$requestArr = array("addPerson" => array("foo", "bar"));
$url = "http://localhost/project/req/personService.php";
$this->assertEquals(HTTPRequester::HTTPPost($url, $requestArr), '[{"error":false}]');
}
/**
* @description test static method HTTPPut
*/
public function testHTTPPut() {
$requestArr = array("updatePerson" => array("foo", "bar"));
$url = "http://localhost/project/req/personService.php";
$this->assertEquals(HTTPRequester::HTTPPut($url, $requestArr), '[{"error":false}]');
}
/**
* @description test static method HTTPDelete
*/
public function testHTTPDelete() {
$requestArr = array("deletePerson" => array("foo", "bar"));
$url = "http://localhost/project/req/personService.php";
$this->assertEquals(HTTPRequester::HTTPDelete($url, $requestArr), '[{"error":false}]');
}
}