Tôi muốn thêm một vài suy nghĩ về câu trả lời dựa trên curl của Fred Tanrikut. Tôi biết hầu hết trong số chúng đã được viết trong các câu trả lời ở trên, nhưng tôi nghĩ rằng đó là một ý tưởng tốt để hiển thị một câu trả lời bao gồm tất cả chúng cùng nhau.
Đây là lớp tôi đã viết để thực hiện các yêu cầu HTTP-GET / POST / PUT / DELETE dựa trên curl, liên quan đến phần thân phản hồi:
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;
}
}
Cải tiến
- Sử dụng http_build_query để đưa chuỗi truy vấn ra khỏi mảng yêu cầu. (Bạn cũng có thể sử dụng chính mảng đó, do đó, hãy xem: http://php.net/manual/en/feft.curl-setopt.php )
- Trả lại phản hồi thay vì lặp lại nó. Btw bạn có thể tránh việc quay lại bằng cách xóa dòng curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true); . Sau đó, giá trị trả về là boolean (true = request đã thành công nếu không xảy ra lỗi) và phản hồi được lặp lại. Xem: http://php.net/en/manual/feft.curl-exec.php
- Làm sạch đóng phiên và xóa trình xử lý curl bằng cách sử dụng curl_c Đóng . Xem: http://php.net/manual/en/feft.curl-close.php
- Sử dụng các giá trị boolean cho curl_setopt hàm thay vì sử dụng bất kỳ số nào. (Tôi biết rằng bất kỳ số nào không bằng 0 cũng được coi là đúng, nhưng việc sử dụng true tạo ra một mã dễ đọc hơn, nhưng đó chỉ là ý kiến của tôi)
- Khả năng thực hiện các cuộc gọi HTTP-PUT / DELETE (hữu ích cho thử nghiệm dịch vụ RESTful)
Ví dụ về cách sử dụng
ĐƯỢC
$response = HTTPRequester::HTTPGet("http://localhost/service/foobar.php", array("getParam" => "foobar"));
BÀI ĐĂNG
$response = HTTPRequester::HTTPPost("http://localhost/service/foobar.php", array("postParam" => "foobar"));
ĐẶT
$response = HTTPRequester::HTTPPut("http://localhost/service/foobar.php", array("putParam" => "foobar"));
XÓA BỎ
$response = HTTPRequester::HTTPDelete("http://localhost/service/foobar.php", array("deleteParam" => "foobar"));
Kiểm tra
Bạn cũng có thể thực hiện một số thử nghiệm dịch vụ thú vị bằng cách sử dụng lớp đơn giản này.
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}]');
}
}