Phần 1 của loạt bài gồm ba phần giúp bạn tìm hiểu các dịch vụ web RESTful bằng PHP. Các hướng dẫn này sẽ toàn diện, bằng cách làm theo chúng, bạn có thể dễ dàng xây dựng các dịch vụ web của riêng mình và sử dụng các dịch vụ bên ngoài
Trong hướng dẫn này, chúng ta sẽ xem cách tạo một dịch vụ web PHP RESTful mà không cần sử dụng bất kỳ khuôn khổ nào. Hầu hết thời gian tôi thích viết mã tùy chỉnh mà không phụ thuộc vào khung vì cách tiếp cận này có rất nhiều lợi thế. Về cơ bản, điều này sẽ giúp bạn tìm hiểu sâu hơn các khái niệm và bạn có thể giữ mọi thứ bóng bẩy và hiệu quả
REST hoặc Chuyển giao trạng thái đại diện là một trong những kiểu kiến trúc phổ biến được sử dụng để phát triển các dịch vụ web. Kiểu kiến trúc này chứa các ràng buộc hoặc quy tắc để thiết kế các dịch vụ web có thể được truy cập từ ứng dụng bên ngoài hoặc ứng dụng web
Mục tiêu của ví dụ dịch vụ web PHP RESTful này
Mục tiêu là xây dựng một dịch vụ web RESTful trong PHP để cung cấp dữ liệu tài nguyên dựa trên yêu cầu với cuộc gọi mạng của các máy khách bên ngoài. Ngoài ra, danh sách các bước sau đây được triển khai trong khi tùy chỉnh ví dụ này mà không phụ thuộc vào bất kỳ khuôn khổ nào
- Tạo URI yêu cầu với các mẫu tuân theo nguyên tắc REST
- Làm cho dịch vụ RESTful có khả năng đáp ứng các yêu cầu ở định dạng JSON, XML và HTML
- Minh họa việc sử dụng mã Trạng thái HTTP dựa trên các tình huống khác nhau
- Chứng minh việc sử dụng Tiêu đề yêu cầu
- Kiểm tra dịch vụ web RESTful bằng ứng dụng khách REST
Làm thế nào nó được thực hiện?
Một mảng tên thương hiệu di động là dữ liệu tài nguyên sẽ được nhắm mục tiêu bởi các ứng dụng khách REST. Tôi có tài nguyên này trong một lớp miền của ví dụ PHP RESTful này
Để truy cập những dữ liệu này thông qua dịch vụ web này, khách hàng sẽ gửi yêu cầu bằng cách đặt URI, tham số với phương thức đã chọn và nhiều thông tin khác
Trình xử lý tài nguyên của dịch vụ web sẽ chuẩn bị phản hồi ở định dạng JSON, XML hoặc HTML dựa trên yêu cầu. Sau đó, phản hồi sẽ được gửi đến khách hàng
Trên Internet, tôi đã xem các hướng dẫn về dịch vụ web và hầu hết thời gian chúng đều dễ bị lỗi hoặc không đầy đủ. Tôi đã thử nghiệm các dịch vụ RESTful đó bằng ứng dụng khách REST và hầu hết chúng đều không thành công
Xem bản trình diễn
Bên trong là gì?
RESTful là gì?
REST là viết tắt của Chuyển giao trạng thái đại diện và nó là một kiểu kiến trúc cho phép giao tiếp giữa các hệ thống. Thuật ngữ REST lần đầu tiên được đặt ra bởi Roy T. Fielding lấy bằng tiến sĩ. luận án
Khái niệm REST được xác định bởi các quy tắc, ràng buộc hoặc nguyên tắc nhất định. Hệ thống, ứng dụng, dịch vụ hoặc bất kỳ thứ gì đáp ứng các nguyên tắc REST này được gọi là RESTful
Các dịch vụ web tuân theo các nguyên tắc RESTful là các dịch vụ RESTful. URI được sử dụng để truy cập các dịch vụ RESTful để lấy tài nguyên
Trong bảng thuật ngữ RESTful, tài nguyên không là gì ngoài dữ liệu và chức năng. Vì vậy cuối cùng, chúng tôi sẽ gọi các dịch vụ web thông qua URI để truy cập các chức năng và từ đó lấy dữ liệu tài nguyên
Ràng buộc REST
Các ràng buộc sau xác định RESTality của một ứng dụng hoặc dịch vụ
- Kiến trúc máy khách-máy chủ
- không quốc tịch
- Giao diện thống nhất
- hệ thống lớp
- Khả năng lưu trữ
- Mã theo yêu cầu
Dịch vụ web RESTful so với dịch vụ web RPC
Bảng sau đây cho thấy sự so sánh giữa các dịch vụ web kiểu RESTful và RPC. So sánh này được thực hiện bởi các yếu tố như URI yêu cầu dịch vụ, phương thức yêu cầu, truyền dữ liệu, trình xử lý dịch vụ, v.v.
Kiến trúc API dịch vụ web RESTful
Sơ đồ sau đây cho thấy kiến trúc dịch vụ web RESTful. Trong sơ đồ này, luồng yêu cầu-phản hồi giữa máy khách-máy chủ được biểu diễn
Trong sơ đồ này, cơ sở dữ liệu được hiển thị dưới dạng tài nguyên. Dựa trên dịch vụ web, tài nguyên có thể là nguồn cấp dữ liệu XML, dữ liệu JSON được trích xuất từ hệ thống tệp hoặc bất kỳ
Công dụng của API RESTful
API RESTful cung cấp các dịch vụ để truy cập tài nguyên từ các ứng dụng bên ngoài hoặc ứng dụng khách REST. Một số cách sử dụng chủ yếu của API RESTful được liệt kê bên dưới
- Là một giao diện có hỗ trợ đa nền tảng, được sử dụng để truy cập tài nguyên từ các ứng dụng bên ngoài được mã hóa bằng nhiều ngôn ngữ lập trình khác nhau như PHP, JAVA, Android, v.v.
- REST là kiểu kiến trúc đơn giản để truyền dữ liệu qua HTTP
- API REST là nhà cung cấp tài nguyên phù hợp nhất cho giao diện ứng dụng dựa trên AJAX yêu cầu dữ liệu để cập nhật giao diện người dùng mà không cần tải lại trang
- Bằng cách đáp ứng nhiều ràng buộc REST hơn, các ứng dụng hoặc dịch vụ web có thể hỗ trợ nhiều loại máy khách
Ví dụ dịch vụ web PHP RESTful
Trong ví dụ dịch vụ web PHP RESTful, lớp miền sau chứa mảng dữ liệu tài nguyên và trình xử lý dịch vụ. Các trình xử lý này được gọi dựa trên yêu cầu được gửi bởi ứng dụng khách REST hoặc ứng dụng bên ngoài
Trong phần tiếp theo, chúng ta có thể xem tất cả các cấu trúc tệp và mục đích của từng tệp trong ví dụ này
'Apple iPhone 6S',
2 => 'Samsung Galaxy S6',
3 => 'Apple iPhone 6S Plus',
4 => 'LG G4',
5 => 'Samsung Galaxy S6 edge',
6 => 'OnePlus 2'
];
/*
* you should hookup the DAO here
*/
public function getAllMobile[]
{
return $this->mobiles;
}
public function getMobile[$id]
{
$mobile = array[
$id => [$this->mobiles[$id]] ? $this->mobiles[$id] : $this->mobiles[1]
];
return $mobile;
}
}
?>
Cấu trúc tệp của dịch vụ ví dụ RESTful
Cấu trúc tệp bên dưới cho thấy sự đơn giản của việc tạo ví dụ về dịch vụ web RESTful
Như đã thảo luận ở trên Di động. php là lớp miền có mảng tài nguyên và trình xử lý để lấy tài nguyên
Các. htaccess được sử dụng để ánh xạ URI yêu cầu tới điểm cuối dịch vụ REST
Trong các phần sau, chúng ta sẽ xem cách URI được ánh xạ và cách trình xử lý dịch vụ được gọi để lấy dữ liệu tài nguyên từ miền. – URI RFC 3986
Ánh xạ URI dịch vụ RESTful
Mọi tài nguyên được xác định thông qua URI [Mã định danh tài nguyên thống nhất]
Mã định danh tài nguyên thống nhất [URI] là một chuỗi ký tự nhỏ gọn xác định tài nguyên vật lý hoặc trừu tượng
RestController. php được hiển thị trong cấu trúc tệp ở trên là điểm cuối PHP mà yêu cầu sẽ được chuyển tiếp
Tôi cung cấp hai URI để truy cập dịch vụ web này từ các ứng dụng bên ngoài hoặc ứng dụng khách REST trong ví dụ này. Một URI sẽ được sử dụng để lấy mảng tên di động hoàn chỉnh ở định dạng JSON và một URI khác là lấy một tên di động cụ thể dựa trên nhận dạng được chuyển qua URI yêu cầu
URIMethodTypeDes mô tảhttp. //localhost/restexample/mobile/list/GETJSONĐể lấy danh sách tên thương hiệu di động trong một mảng JSON. http. //localhost/restexample/mobile/list/{id}/GETJSONĐể lấy một mảng dữ liệu di động duy nhất theo nhận dạng được truyền qua URLCác URI sau được ánh xạ tới tệp thực thông qua. tập tin htaccess
URI để lấy danh sách tất cả các điện thoại di động
//localhost/restexample/mobile/list/
URI để nhận chi tiết của một thiết bị di động cụ thể bằng cách sử dụng id của nó
Trong URI bên dưới, số '2' là id của điện thoại di động. Lớp miền tài nguyên có thể lấy dữ liệu cụ thể với tham chiếu của tham số id này
//localhost/restexample/mobile/list/2/
Đoạn mã dưới đây hiển thị các quy tắc và ánh xạ URL đầy đủ được tạo cho ví dụ về dịch vụ web PHP RESTful này trong tệp .htaccess
của nó
# Turn rewrite engine on
Options +FollowSymlinks
RewriteEngine on
# map neat URL to internal URL
RewriteRule ^mobile/list/$ RestController.php?view=all [nc,qsa]
RewriteRule ^mobile/list/[[0-9]+]/$ RestController.php?view=single&id=$1 [nc,qsa]
Bộ điều khiển dịch vụ web RESTful
Trong tệp_______7, chúng tôi đang chuyển tiếp tất cả các yêu cầu tới RestController. tập tin php
Trong khi chuyển tiếp yêu cầu, các tham số được gửi để thực thi một phần bắt buộc của bộ điều khiển REST. Tham số này là khóa có tên 'view'
Giá trị của tham số chính có thể là “tất cả” hoặc “đơn” dựa trên URI yêu cầu
Sau đây là RestController. tệp php nhận yêu cầu và nhận tham số xem. Dựa trên giá trị tham số này, trường hợp điều khiển thích hợp sẽ được thực thi
Trong các trường hợp bộ điều khiển, yêu cầu được gửi đến các phương thức tương ứng được tạo trong lớp trình xử lý REST
getAllMobiles[];
break;
case "single":
// to handle REST Url /mobile/show//
$mobileRestHandler = new MobileRestHandler[];
$mobileRestHandler->getMobile[$_GET["id"]];
break;
case "":
// 404 - not found;
break;
}
?>
Một lớp cơ sở RESTful đơn giản
Lớp sau có một số phương thức có thể được sử dụng phổ biến cho trình xử lý dịch vụ RESTful
Phương thức getHttpStatusMessage[] được sử dụng để lấy thông báo trạng thái HTTP để tạo phản hồi. Nó chứa mã trạng thái HTTP và mảng ánh xạ thông báo
Bằng cách nhận mã trạng thái, nó sẽ trả về thông báo phản hồi tiêu đề thích hợp. Nếu mã trạng thái không hợp lệ được chuyển đến chức năng này hoặc không tìm thấy mã như vậy trong mảng ánh xạ, thì "Lỗi máy chủ không hợp lệ" sẽ được trả về trong phản hồi
Các phương thức này có thể thường được sử dụng trong lớp cơ sở của các dịch vụ web PHP RESTful đơn giản
getHttpStatusMessage[$statusCode];
header[$this->httpVersion . " " . $statusCode . " " . $statusMessage];
header["Content-Type:" . $contentType];
}
public function getHttpStatusMessage[$statusCode]
{
$httpStatus = array[
100 => 'Continue',
101 => 'Switching Protocols',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => '[Unused]',
307 => 'Temporary Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported'
];
return [$httpStatus[$statusCode]] ? $httpStatus[$statusCode] : $httpStatus[500];
}
}
?>
Trình xử lý dịch vụ web RESTful
Đây là lớp dịch vụ của ví dụ PHP này xử lý yêu cầu REST được gửi từ bộ điều khiển
Đầu tiên, chúng ta phải quyết định về định dạng phản hồi trong đó dữ liệu tài nguyên phải được chuẩn bị. Nó dựa trên các tham số tiêu đề yêu cầu
Trong tiêu đề yêu cầu, tham số “Chấp nhận” sẽ có thông số kỹ thuật về định dạng hoặc loại nội dung phản hồi
Giao thức ở đây là, khi yêu cầu được gửi đi, nó sẽ đặt tham số tiêu đề Yêu cầu là “Chấp nhận” và gửi đi. Các giá trị có thể giống như “application/json” hoặc “application/xml” hoặc “text/html”
Dựa trên các giá trị này, dữ liệu phản hồi sẽ sẵn sàng bằng cách gọi các phương thức thích hợp encodeJson[], encodeXML[], encodeHTML[] được hiển thị bên dưới
Sau đó, mã trạng thái phải được trả lại cho máy khách cùng với dữ liệu phản hồi. Khi thành công, mã trạng thái sẽ là 200
Tương tự, có sẵn các mã trạng thái khác nhau và chúng nên được sử dụng tương ứng để đặt tiêu đề phản hồi như chúng ta đã thảo luận trong phần trên
getAllMobile[];
if [empty[$rawData]] {
$statusCode = 404;
$rawData = array[
'error' => 'No mobiles found!'
];
} else {
$statusCode = 200;
}
$requestContentType = $_SERVER['HTTP_ACCEPT'];
$this->setHttpHeaders[$requestContentType, $statusCode];
if [strpos[$requestContentType, 'application/json'] !== false] {
$response = $this->encodeJson[$rawData];
echo $response;
} else if [strpos[$requestContentType, 'text/html'] !== false] {
$response = $this->encodeHtml[$rawData];
echo $response;
} else if [strpos[$requestContentType, 'application/xml'] !== false] {
$response = $this->encodeXml[$rawData];
echo $response;
}
}
public function encodeHtml[$responseData]
{
$htmlResponse = "";
foreach [$responseData as $key => $value] {
$htmlResponse .= "";
}
$htmlResponse .= "" . $key . "" . $value . "";
return $htmlResponse;
}
public function encodeJson[$responseData]
{
$jsonResponse = json_encode[$responseData];
return $jsonResponse;
}
public function encodeXml[$responseData]
{
// creating object of SimpleXMLElement
$xml = new SimpleXMLElement[''];
foreach [$responseData as $key => $value] {
$xml->addChild[$key, $value];
}
return $xml->asXML[];
}
public function getMobile[$id]
{
$mobile = new Mobile[];
$rawData = $mobile->getMobile[$id];
if [empty[$rawData]] {
$statusCode = 404;
$rawData = array[
'error' => 'No mobiles found!'
];
} else {
$statusCode = 200;
}
$requestContentType = $_SERVER['HTTP_ACCEPT'];
$this->setHttpHeaders[$requestContentType, $statusCode];
if [strpos[$requestContentType, 'application/json'] !== false] {
$response = $this->encodeJson[$rawData];
echo $response;
} else if [strpos[$requestContentType, 'text/html'] !== false] {
$response = $this->encodeHtml[$rawData];
echo $response;
} else if [strpos[$requestContentType, 'application/xml'] !== false] {
$response = $this->encodeXml[$rawData];
echo $response;
}
}
}
?>
Máy khách dịch vụ web RESTful
Có nhiều ứng dụng khách REST độc lập khác nhau có sẵn trên thị trường. Các giao diện máy khách này được sử dụng để kiểm tra dịch vụ web RESTful
Tiện ích mở rộng Advanced Rest Client có thể được thêm vào Chrome được cài đặt trên máy của bạn
Chúng tôi cũng có thể viết ứng dụng khách tùy chỉnh của riêng mình để kiểm tra dịch vụ web RESTful
Tôi đã sử dụng ứng dụng khách REST của tiện ích mở rộng Google Chrome này để thử nghiệm ví dụ về dịch vụ web PHP RESTful này
Đầu ra dịch vụ web PHP RESTful
Ảnh chụp màn hình bên dưới cho thấy cách gọi dịch vụ web RESTful. Trong ảnh chụp màn hình này, các phần được khoanh tròn làm nổi bật URI yêu cầu, phương thức yêu cầu đã chọn, thông số Chấp nhận của tiêu đề và các chi tiết khác
Bằng cách nhấp vào nút gửi, phản hồi sẽ được trả về từ dịch vụ web PHP RESTful
Phản hồi XML
Tôi đặt ứng dụng/xml làm loại phản hồi. Vì vậy, dữ liệu tài nguyên kết quả được chuẩn bị ở định dạng được yêu cầu như trong phần phản hồi của ảnh chụp màn hình bên dưới
Phản hồi JSON của dịch vụ web RESTful PHP
Sự kết luận
Trong loạt bài hướng dẫn gồm ba phần này về các dịch vụ web RESTful sử dụng PHP, bạn sẽ tìm hiểu chi tiết về cách triển khai RESTful bằng cách sử dụng tài liệu toàn diện này. Phần đầu tiên này đã cung cấp cho bạn phần giới thiệu đầy đủ về các khái niệm với các ví dụ từng bước
Với kiến thức mà bạn có được từ hướng dẫn này, về các quy tắc và nguyên tắc của RESTful, bạn có thể xây dựng một API RESTful một cách dễ dàng. Mặc dù có các khung để phát triển API RESTful, nhưng có thể thực hiện bằng cách sử dụng PHP lõi đơn giản sẽ hiệu quả và mang lại hiệu suất tốt
Trong phần tiếp theo, bạn sẽ thấy về tất cả các khía cạnh của việc phát triển API dịch vụ web CRUD RESTful bằng cách sử dụng PHP cho một thực thể