Chính xác thì lập trình RESTful là gì?
Chính xác thì lập trình RESTful là gì?
Câu trả lời:
Một kiểu kiến trúc được gọi là REST (Chuyển giao trạng thái đại diện) ủng hộ rằng các ứng dụng web nên sử dụng HTTP như ban đầu được hình dung . Tra cứu nên sử dụng GET
yêu cầu. PUT
, POST
và DELETE
các yêu cầu nên được sử dụng cho đột biến, tạo và xóa tương ứng .
Những người đề xuất REST có xu hướng ủng hộ các URL, chẳng hạn như
http://myserver.com/catalog/item/1729
nhưng kiến trúc REST không yêu cầu những "URL đẹp" này. Một yêu cầu GET với một tham số
http://myserver.com/catalog?item=1729
là mỗi bit như RESTful.
Hãy nhớ rằng không bao giờ nên sử dụng các yêu cầu GET để cập nhật thông tin. Ví dụ: yêu cầu GET để thêm một mục vào giỏ hàng
http://myserver.com/addToCart?cart=314159&item=1729
sẽ không thích hợp Yêu cầu GET nên idempotent . Đó là, phát hành một yêu cầu hai lần sẽ không khác gì phát hành một lần. Đó là những gì làm cho các yêu cầu được lưu trữ. Yêu cầu "thêm vào giỏ hàng" không phải là idempotent, ban hành hai lần thêm hai bản sao của mục vào giỏ hàng. Một yêu cầu POST rõ ràng thích hợp trong bối cảnh này. Do đó, ngay cả một ứng dụng web RESTful cũng cần chia sẻ các yêu cầu POST.
Điều này được lấy từ cuốn sách tuyệt vời Core JavaServer phải đối mặt với cuốn sách của David M. Geary.
REST là nguyên tắc kiến trúc cơ bản của web. Điều tuyệt vời về web là thực tế rằng máy khách (trình duyệt) và máy chủ có thể tương tác theo những cách phức tạp mà không cần khách hàng biết trước về máy chủ và tài nguyên mà nó lưu trữ. Hạn chế chính là cả máy chủ và máy khách đều phải đồng ý về phương tiện được sử dụng, trong trường hợp web là HTML .
Một API tuân thủ các nguyên tắc của REST không yêu cầu khách hàng biết bất cứ điều gì về cấu trúc của API. Thay vào đó, máy chủ cần cung cấp bất kỳ thông tin nào khách hàng cần để tương tác với dịch vụ. Biểu mẫu HTML là một ví dụ về điều này: Máy chủ chỉ định vị trí của tài nguyên và các trường bắt buộc. Trình duyệt không biết trước nơi gửi thông tin và không biết trước thông tin nào cần gửi. Cả hai dạng thông tin đều được cung cấp hoàn toàn bởi máy chủ. (Nguyên tắc này được gọi là HATEOAS : Hypermedia là động cơ của trạng thái ứng dụng .)
Vì vậy, làm thế nào điều này áp dụng cho HTTP và làm thế nào nó có thể được thực hiện trong thực tế? HTTP được định hướng xung quanh các động từ và tài nguyên. Hai động từ trong cách sử dụng chính là GET
và POST
, mà tôi nghĩ mọi người sẽ nhận ra. Tuy nhiên, tiêu chuẩn HTTP định nghĩa một số khác như PUT
và DELETE
. Những động từ này sau đó được áp dụng cho các tài nguyên, theo các hướng dẫn được cung cấp bởi máy chủ.
Ví dụ: Hãy tưởng tượng rằng chúng ta có cơ sở dữ liệu người dùng được quản lý bởi một dịch vụ web. Dịch vụ của chúng tôi sử dụng một hypermedia tùy chỉnh dựa trên JSON, mà chúng tôi chỉ định mô phỏng application/json+userdb
(Cũng có thể có application/xml+userdb
và application/whatever+userdb
- nhiều loại phương tiện có thể được hỗ trợ). Cả máy khách và máy chủ đều được lập trình để hiểu định dạng này, nhưng chúng không biết gì về nhau. Như Roy Fielding chỉ ra:
API REST nên dành hầu hết tất cả nỗ lực mô tả của nó để xác định (các) loại phương tiện được sử dụng để thể hiện tài nguyên và trạng thái ứng dụng lái xe hoặc trong việc xác định tên quan hệ mở rộng và / hoặc đánh dấu siêu văn bản cho các loại phương tiện tiêu chuẩn hiện có.
Một yêu cầu cho tài nguyên cơ sở /
có thể trả về một cái gì đó như thế này:
Yêu cầu
GET /
Accept: application/json+userdb
Phản ứng
200 OK
Content-Type: application/json+userdb
{
"version": "1.0",
"links": [
{
"href": "/user",
"rel": "list",
"method": "GET"
},
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
Chúng tôi biết từ mô tả về phương tiện truyền thông của mình rằng chúng tôi có thể tìm thấy thông tin về các tài nguyên liên quan từ các phần được gọi là "liên kết". Điều này được gọi là điều khiển Hypermedia . Trong trường hợp này, chúng tôi có thể nói từ một phần như vậy mà chúng tôi có thể tìm thấy danh sách người dùng bằng cách thực hiện một yêu cầu khác cho /user
:
Yêu cầu
GET /user
Accept: application/json+userdb
Phản ứng
200 OK
Content-Type: application/json+userdb
{
"users": [
{
"id": 1,
"name": "Emil",
"country: "Sweden",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
{
"id": 2,
"name": "Adam",
"country: "Scotland",
"links": [
{
"href": "/user/2",
"rel": "self",
"method": "GET"
},
{
"href": "/user/2",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/2",
"rel": "delete",
"method": "DELETE"
}
]
}
],
"links": [
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
Chúng tôi có thể nói rất nhiều từ phản ứng này. Ví dụ, bây giờ chúng ta biết chúng ta có thể tạo một người dùng mới bằng cách POST
ing để /user
:
Yêu cầu
POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Karl",
"country": "Austria"
}
Phản ứng
201 Created
Content-Type: application/json+userdb
{
"user": {
"id": 3,
"name": "Karl",
"country": "Austria",
"links": [
{
"href": "/user/3",
"rel": "self",
"method": "GET"
},
{
"href": "/user/3",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/3",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
Chúng tôi cũng biết rằng chúng tôi có thể thay đổi dữ liệu hiện có:
Yêu cầu
PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Emil",
"country": "Bhutan"
}
Phản ứng
200 OK
Content-Type: application/json+userdb
{
"user": {
"id": 1,
"name": "Emil",
"country": "Bhutan",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
Chú ý rằng chúng ta đang sử dụng động từ HTTP khác nhau ( GET
, PUT
, POST
, DELETE
vv) để thao tác các tài nguyên, và rằng những kiến thức duy nhất chúng ta đoán trên một phần của khách hàng là định nghĩa phương tiện truyền thông của chúng tôi.
Đọc thêm:
. lần đầu tiên viết điều này, thay vì ý nghĩa thực sự của nó. Tôi đã sửa đổi câu trả lời để thể hiện tốt hơn ý nghĩa thực sự.)
Lập trình RESTful là về:
Create
, Retrieve
, Update
, Delete
trở POST
, GET
, PUT
, và DELETE
. Nhưng REST không giới hạn ở HTTP, nó chỉ là phương tiện giao thông được sử dụng phổ biến nhất hiện nay.Cái cuối cùng có lẽ là quan trọng nhất về hậu quả và hiệu quả tổng thể của REST. Nhìn chung, hầu hết các cuộc thảo luận RESTful dường như tập trung vào HTTP và việc sử dụng nó từ trình duyệt và những gì không. Tôi hiểu rằng R. Fielding đã đặt ra thuật ngữ khi ông mô tả kiến trúc và các quyết định dẫn đến HTTP. Luận án của ông thiên về kiến trúc và khả năng lưu trữ tài nguyên của bộ đệm hơn là về HTTP.
Nếu bạn thực sự quan tâm đến kiến trúc RESTful là gì và tại sao nó hoạt động, hãy đọc luận án của anh ấy một vài lần và đọc toàn bộ không chỉ Chương 5! Tiếp theo xem xét tại sao DNS hoạt động . Đọc về tổ chức phân cấp của DNS và cách giới thiệu hoạt động. Sau đó đọc và xem xét cách bộ nhớ cache DNS hoạt động. Cuối cùng, hãy đọc các thông số kỹ thuật HTTP (đặc biệt là RFC2616 và RFC3040 ) và xem xét cách thức và lý do tại sao bộ đệm hoạt động theo cách mà nó làm. Cuối cùng, nó sẽ chỉ cần nhấp. Sự tiết lộ cuối cùng đối với tôi là khi tôi thấy sự tương đồng giữa DNS và HTTP. Sau này, hiểu lý do tại sao các Giao diện Truyền thông và Thông báo có thể mở rộng bắt đầu nhấp vào.
Tôi nghĩ rằng mẹo quan trọng nhất để hiểu tầm quan trọng của kiến trúc và ý nghĩa hiệu suất của kiến trúc RESTful và Shared Không có gì là tránh bị treo lên về công nghệ và chi tiết triển khai. Tập trung vào người sở hữu tài nguyên, người chịu trách nhiệm tạo / duy trì chúng, v.v. Sau đó, hãy suy nghĩ về các đại diện, giao thức và công nghệ.
PUT
và POST
không thực sự ánh xạ một-một với cập nhật và tạo. PUT
có thể được sử dụng để tạo nếu máy khách đang ra lệnh URI sẽ là gì. POST
tạo nếu máy chủ đang gán URI mới.
urn:
lược đồ. Về mặt khái niệm không có sự khác biệt; tuy nhiên, URN yêu cầu bạn có một phương thức được xác định riêng để "định vị" tài nguyên được xác định (được đặt tên) bởi URN. Phải cẩn thận để đảm bảo rằng bạn không giới thiệu khớp nối ngầm khi liên quan đến tài nguyên được đặt tên và vị trí của chúng.
Đây là những gì nó có thể trông như thế nào.
Tạo người dùng với ba thuộc tính:
POST /user
fname=John&lname=Doe&age=25
Máy chủ trả lời:
200 OK
Location: /user/123
Trong tương lai, sau đó bạn có thể truy xuất thông tin người dùng:
GET /user/123
Máy chủ trả lời:
200 OK
<fname>John</fname><lname>Doe</lname><age>25</age>
Để sửa đổi bản ghi ( lname
và age
sẽ không thay đổi):
PATCH /user/123
fname=Johnny
Để cập nhật bản ghi (và do đó lname
và age
sẽ là NULL):
PUT /user/123
fname=Johnny
PUT fname=Jonny
. Điều này sẽ đặt lname
và age
thành các giá trị mặc định (có thể là NULL hoặc chuỗi rỗng và số nguyên 0), vì PUT
ghi đè toàn bộ tài nguyên bằng dữ liệu từ biểu diễn được cung cấp. Đây không phải là những gì được ngụ ý bởi "cập nhật", để thực hiện cập nhật thực sự, hãy sử dụng PATCH
phương thức này vì điều này không làm thay đổi các trường không được chỉ định trong biểu diễn.
/user/1
không có ý nghĩa và nên có một danh sách tại /users
. Câu trả lời phải là một 201 Created
và không chỉ OK trong trường hợp đó.
Một cuốn sách tuyệt vời về REST là REST in Practice .
Phải đọc là Chuyển giao trạng thái đại diện (REST) và API REST phải được điều khiển siêu văn bản
Xem bài viết của Martin Fowlers về Mô hình trưởng thành của Richardson (RMM) để được giải thích về dịch vụ RESTful là gì.
Để trở thành RESTful, một Dịch vụ cần phải hoàn thành Hypermedia làm Trạng thái Ứng dụng. (HATEOAS) , nghĩa là, nó cần đạt cấp 3 trong RMM, đọc bài viết để biết chi tiết hoặc các slide từ bài nói chuyện của qcon .
Ràng buộc HATEOAS là từ viết tắt của Hypermedia với tư cách là Công cụ của Trạng thái Ứng dụng. Nguyên tắc này là điểm khác biệt chính giữa REST và hầu hết các dạng khác của hệ thống máy chủ khách.
...
Một khách hàng của ứng dụng RESTful chỉ cần biết một URL cố định duy nhất để truy cập nó. Tất cả các hành động trong tương lai phải được phát hiện một cách linh hoạt từ các liên kết hypermedia có trong các đại diện của các tài nguyên được trả về từ URL đó. Các loại phương tiện được tiêu chuẩn hóa cũng được dự kiến sẽ được hiểu bởi bất kỳ khách hàng nào có thể sử dụng API RESTful. (Từ Wikipedia, bách khoa toàn thư miễn phí)
REST Litmus Test cho Web Frameworks là một thử nghiệm trưởng thành tương tự cho các khung web.
Tiếp cận REST thuần túy: Học cách yêu HATEOAS là một bộ sưu tập tốt các liên kết.
REST so với SOAP cho Đám mây Công cộng thảo luận về mức độ sử dụng REST hiện tại.
REST và phiên bản thảo luận về Khả năng mở rộng, Phiên bản, Khả năng phát triển, v.v. thông qua Sửa đổi
REST là gì?
REST là viết tắt của Chuyển giao Nhà nước Đại diện. (Đôi khi nó được đánh vần là "ReST".) Nó dựa trên một giao thức truyền thông không trạng thái, máy chủ, máy chủ lưu trữ - và trong hầu hết mọi trường hợp, giao thức HTTP được sử dụng.
REST là một kiểu kiến trúc để thiết kế các ứng dụng nối mạng. Ý tưởng là, thay vì sử dụng các cơ chế phức tạp như CORBA, RPC hoặc SOAP để kết nối giữa các máy, HTTP đơn giản được sử dụng để thực hiện cuộc gọi giữa các máy.
Theo nhiều cách, World Wide Web, dựa trên HTTP, có thể được xem như một kiến trúc dựa trên REST. Các ứng dụng RESTful sử dụng các yêu cầu HTTP để đăng dữ liệu (tạo và / hoặc cập nhật), đọc dữ liệu (ví dụ: thực hiện truy vấn) và xóa dữ liệu. Do đó, REST sử dụng HTTP cho cả bốn thao tác CRUD (Tạo / Đọc / Cập nhật / Xóa).
REST là một giải pháp thay thế nhẹ cho các cơ chế như RPC (Cuộc gọi thủ tục từ xa) và Dịch vụ web (SOAP, WSDL, et al.). Sau đó, chúng ta sẽ thấy REST đơn giản hơn nhiều.
Mặc dù đơn giản, REST có đầy đủ tính năng; về cơ bản không có gì bạn có thể làm trong Dịch vụ web không thể thực hiện được với kiến trúc RESTful. REST không phải là "tiêu chuẩn". Chẳng hạn, sẽ không bao giờ có khuyến nghị W3C cho REST. Và trong khi có các khung lập trình REST, làm việc với REST đơn giản đến mức bạn có thể thường xuyên "tự lăn" với các tính năng thư viện tiêu chuẩn bằng các ngôn ngữ như Perl, Java hoặc C #.
Một trong những tài liệu tham khảo tốt nhất tôi tìm thấy khi tôi cố gắng tìm ý nghĩa thực sự đơn giản của phần còn lại.
REST đang sử dụng các phương thức HTTP khác nhau (chủ yếu là GET / PUT / DELETE) để thao tác dữ liệu.
Thay vì sử dụng một URL cụ thể để xóa một phương thức (giả sử /user/123/delete
), bạn sẽ gửi yêu cầu XÓA tới /user/[id]
URL, để chỉnh sửa người dùng, để truy xuất thông tin về người dùng mà bạn gửi yêu cầu GET tới/user/[id]
Ví dụ: thay vì một tập hợp các URL có thể trông giống như một số điều sau đây ..
GET /delete_user.x?id=123
GET /user/delete
GET /new_user.x
GET /user/new
GET /user?id=1
GET /user/id/1
Bạn sử dụng các "động từ" HTTP và có ..
GET /user/2
DELETE /user/2
PUT /user
Đó là lập trình trong đó kiến trúc của hệ thống của bạn phù hợp với phong cách REST được trình bày bởi Roy Fielding trong luận án của mình . Vì đây là phong cách kiến trúc mô tả web (ít nhiều), rất nhiều người quan tâm đến nó.
Phần thưởng trả lời: Không. Trừ khi bạn học kiến trúc phần mềm như một dịch vụ web học thuật hoặc thiết kế, thực sự không có lý do gì để nghe thuật ngữ này.
Tôi có thể nói lập trình RESTful sẽ là về việc tạo các hệ thống (API) theo phong cách kiến trúc REST.
Tôi đã tìm thấy hướng dẫn tuyệt vời, ngắn gọn và dễ hiểu này về REST của Tiến sĩ M. Elkstein và trích dẫn phần thiết yếu sẽ trả lời câu hỏi của bạn cho phần lớn:
REST là một kiểu kiến trúc để thiết kế các ứng dụng nối mạng. Ý tưởng là, thay vì sử dụng các cơ chế phức tạp như CORBA, RPC hoặc SOAP để kết nối giữa các máy, HTTP đơn giản được sử dụng để thực hiện cuộc gọi giữa các máy.
- Theo nhiều cách, World Wide Web, dựa trên HTTP, có thể được xem như một kiến trúc dựa trên REST.
Các ứng dụng RESTful sử dụng các yêu cầu HTTP để đăng dữ liệu (tạo và / hoặc cập nhật), đọc dữ liệu (ví dụ: thực hiện truy vấn) và xóa dữ liệu. Do đó, REST sử dụng HTTP cho cả bốn thao tác CRUD (Tạo / Đọc / Cập nhật / Xóa).
Tôi không nghĩ bạn nên cảm thấy ngu ngốc khi không nghe về REST bên ngoài Stack Overflow ..., tôi sẽ ở trong tình huống tương tự!; câu trả lời cho câu hỏi SO khác này về lý do tại sao REST trở nên lớn hơn bây giờ có thể làm dịu một số cảm xúc.
Tôi xin lỗi nếu tôi không trả lời trực tiếp câu hỏi, nhưng sẽ dễ hiểu hơn tất cả những điều này với các ví dụ chi tiết hơn. Fielding không dễ hiểu do tất cả sự trừu tượng và thuật ngữ.
Có một ví dụ khá hay ở đây:
Giải thích về REST và Hypertext: Spam-E Robot dọn dẹp thư rác
Và thậm chí tốt hơn, có một lời giải thích rõ ràng với các ví dụ đơn giản ở đây (powerpoint toàn diện hơn, nhưng bạn có thể nhận được hầu hết trong phiên bản html):
http://www.xfront.com/REST.ppt hoặc http://www.xfront.com/REST.html
Sau khi đọc các ví dụ, tôi có thể thấy tại sao Ken nói rằng REST được điều khiển siêu văn bản. Tôi thực sự không chắc chắn rằng anh ấy đúng, bởi vì / user / 123 là một URI trỏ đến một tài nguyên và đối với tôi không rõ ràng rằng nó không HẤP DẪN chỉ vì khách hàng biết về nó "ngoài băng tần".
Tài liệu xfront đó giải thích sự khác biệt giữa REST và SOAP và điều này cũng thực sự hữu ích. Khi Fielding nói, " Đó là RPC. Nó hét RPC. ", Rõ ràng RPC không phải là RESTful, vì vậy thật hữu ích khi xem lý do chính xác cho việc này. (SOAP là một loại RPC.)
REST là gì?
REST nói theo cách chính thức, REST là một kiểu kiến trúc được xây dựng trên các nguyên tắc nhất định bằng cách sử dụng các nguyên tắc cơ bản hiện tại của Web Web. Có 5 nguyên tắc cơ bản của web được tận dụng để tạo ra các dịch vụ REST.
Communication is Done by Representation
nghĩa là gì?
Tôi thấy một loạt các câu trả lời nói rằng đặt mọi thứ về người dùng 123 vào tài nguyên "/ user / 123" là RESTful.
Roy Fielding, người đặt ra thuật ngữ này, nói rằng API REST phải được điều khiển siêu văn bản . Cụ thể, "API REST không được xác định tên hoặc cấu trúc phân cấp tài nguyên cố định".
Vì vậy, nếu đường dẫn "/ user / 123" của bạn được mã hóa cứng trên máy khách, thì nó không thực sự RESTful. Một cách sử dụng tốt HTTP, có thể, có thể không. Nhưng không PHỤC HỒI. Nó phải đến từ siêu văn bản.
Câu trả lời rất đơn giản, có một luận văn được viết bởi Roy Fielding.] 1 Trong luận án đó, ông định nghĩa các nguyên tắc REST. Nếu một ứng dụng đáp ứng tất cả các nguyên tắc đó, thì đó là ứng dụng REST.
Thuật ngữ RESTful được tạo vì ppl làm cạn kiệt từ REST bằng cách gọi ứng dụng không phải REST của họ là REST. Sau đó, thuật ngữ RESTful cũng đã cạn kiệt. Ngày nay chúng ta đang nói về API Web và API Hypermedia , bởi vì hầu hết các ứng dụng REST được gọi là không hoàn thành phần HATEOAS của ràng buộc giao diện thống nhất.
Các ràng buộc REST như sau:
kiến trúc máy khách-máy chủ
Vì vậy, nó không hoạt động với các socket PUB / SUB, ví dụ, nó dựa trên REQ / REP.
giao tiếp không quốc tịch
Vì vậy, máy chủ không duy trì trạng thái của khách hàng. Điều này có nghĩa là bạn không thể sử dụng máy chủ lưu trữ phiên bên và bạn phải xác thực mọi yêu cầu. Khách hàng của bạn có thể gửi các tiêu đề xác thực cơ bản thông qua kết nối được mã hóa. (Bằng các ứng dụng lớn, thật khó để duy trì nhiều phiên.)
sử dụng bộ đệm nếu bạn có thể
Vì vậy, bạn không phải phục vụ cùng một yêu cầu nhiều lần.
giao diện thống nhất như hợp đồng chung giữa máy khách và máy chủ
Hợp đồng giữa máy khách và máy chủ không được duy trì bởi máy chủ. Nói cách khác, khách hàng phải được tách rời khỏi việc thực hiện dịch vụ. Bạn có thể đạt đến trạng thái này bằng cách sử dụng các giải pháp tiêu chuẩn, như tiêu chuẩn IRI (URI) để xác định tài nguyên, tiêu chuẩn HTTP để trao đổi thông điệp, các loại MIME tiêu chuẩn để mô tả định dạng tuần tự hóa cơ thể, siêu dữ liệu (có thể là vocab RDF, microformats, v.v.) mô tả ngữ nghĩa của các phần khác nhau của cơ thể thông điệp. Để tách cấu trúc IRI khỏi máy khách, bạn phải gửi siêu liên kết đến máy khách ở các định dạng hypermedia như (HTML, JSON-LD, HAL, v.v.). Vì vậy, khách hàng có thể sử dụng siêu dữ liệu (có thể là quan hệ liên kết, các từ vựng RDF) được gán cho các siêu liên kết để điều hướng máy trạng thái của ứng dụng thông qua các chuyển đổi trạng thái phù hợp để đạt được mục tiêu hiện tại.
Ví dụ: khi khách hàng muốn gửi đơn đặt hàng đến webshop, thì nó phải kiểm tra các siêu liên kết trong các phản hồi được gửi bởi webshop. Bằng cách kiểm tra các liên kết, nó tìm thấy một liên kết được mô tả với http://schema.org/OrderAction . Máy khách biết vocab giản đồ.org, vì vậy nó hiểu rằng bằng cách kích hoạt siêu liên kết này, nó sẽ gửi đơn đặt hàng. Vì vậy, nó kích hoạt siêu liên kết và gửi một POST https://example.com/api/v1/order
tin nhắn với cơ thể thích hợp. Sau đó, dịch vụ xử lý thông báo và trả lời với kết quả có tiêu đề trạng thái HTTP phù hợp, ví dụ như 201 - created
thành công. Để chú thích các thông điệp với siêu dữ liệu chi tiết, giải pháp tiêu chuẩn sử dụng định dạng RDF, ví dụ JSON-LD với một từ vựng REST, ví dụ như Hydra và các từ vựng cụ thể của miền nhưlược đồ.org hoặc bất kỳ vocab dữ liệu được liên kết nào khác và có thể là một vocab cụ thể của ứng dụng tùy chỉnh nếu cần. Bây giờ điều này không dễ dàng, đó là lý do tại sao hầu hết các ppl sử dụng HAL và các định dạng đơn giản khác thường chỉ cung cấp một vocab REST, nhưng không hỗ trợ dữ liệu được liên kết.
xây dựng một hệ thống lớp để tăng khả năng mở rộng
Hệ thống REST bao gồm các lớp phân cấp. Mỗi lớp chứa các thành phần sử dụng dịch vụ của các thành phần nằm trong lớp tiếp theo bên dưới. Vì vậy, bạn có thể thêm các lớp mới và các thành phần dễ dàng.
Ví dụ, có một lớp máy khách chứa các máy khách và bên dưới có một lớp dịch vụ chứa một dịch vụ duy nhất. Bây giờ bạn có thể thêm bộ đệm phía máy khách giữa chúng. Sau đó, bạn có thể thêm một phiên bản dịch vụ khác và bộ cân bằng tải, v.v ... Mã khách hàng và mã dịch vụ sẽ không thay đổi.
mã theo yêu cầu để mở rộng chức năng khách hàng
Ràng buộc này là tùy chọn. Ví dụ: bạn có thể gửi trình phân tích cú pháp cho một loại phương tiện cụ thể đến máy khách, v.v ... Để làm điều này, bạn có thể cần một hệ thống trình tải plugin tiêu chuẩn trong máy khách, hoặc máy khách của bạn sẽ được ghép nối với giải pháp trình tải plugin .
Các ràng buộc REST dẫn đến một hệ thống có khả năng mở rộng cao, trong đó các máy khách được tách rời khỏi việc triển khai các dịch vụ. Vì vậy, các máy khách có thể được sử dụng lại, nói chung giống như các trình duyệt trên web. Các khách hàng và dịch vụ có chung các tiêu chuẩn và từ vựng, vì vậy họ có thể hiểu nhau mặc dù thực tế là khách hàng không biết chi tiết triển khai dịch vụ. Điều này cho phép tạo các máy khách tự động có thể tìm và sử dụng các dịch vụ REST để đạt được mục tiêu của chúng. Về lâu dài, những khách hàng này có thể giao tiếp với nhau và tin tưởng lẫn nhau bằng các nhiệm vụ, giống như con người. Nếu chúng ta thêm mô hình học tập vào các máy khách như vậy, thì kết quả sẽ là một hoặc nhiều AI sử dụng web của máy thay vì một công viên máy chủ. Vì vậy, vào cuối giấc mơ của Berners Lee: web ngữ nghĩa và trí tuệ nhân tạo sẽ là hiện thực. Vì vậy, vào năm 2030, chúng tôi đã kết thúc bằng Skynet. Cho đến lúc đó ... ;-)
Lập trình API RESTful (Chuyển trạng thái đại diện) đang viết các ứng dụng web bằng bất kỳ ngôn ngữ lập trình nào bằng cách tuân theo 5 nguyên tắc kiểu kiến trúc phần mềm cơ bản :
Nói cách khác, bạn đang viết các ứng dụng mạng điểm-điểm đơn giản qua HTTP, sử dụng các động từ như GET, POST, PUT hoặc DELETE bằng cách triển khai kiến trúc RESTful, đề xuất tiêu chuẩn hóa giao diện mà mỗi tài nguyên của Tráng xuất hiện. Không có gì là sử dụng các tính năng hiện tại của web một cách đơn giản và hiệu quả (kiến trúc phân tán và thành công cao). Nó là một thay thế cho các cơ chế phức tạp hơn như SOAP , CORBA và RPC .
Lập trình RESTful phù hợp với thiết kế kiến trúc Web và, nếu được triển khai đúng cách, nó cho phép bạn tận dụng tối đa lợi thế của cơ sở hạ tầng Web có thể mở rộng.
Nếu tôi phải giảm luận văn ban đầu về REST xuống chỉ còn 3 câu ngắn, tôi nghĩ những điều sau đây nắm bắt được bản chất của nó:
Sau đó, thật dễ dàng để rơi vào các cuộc tranh luận về thích ứng, quy ước mã hóa và thực tiễn tốt nhất.
Thật thú vị, không có đề cập đến các hoạt động HTTP POST, GET, DELETE hoặc PUT trong luận án. Đó phải là cách giải thích sau này của một người nào đó về "thực tiễn tốt nhất" cho "giao diện thống nhất".
Khi nói đến các dịch vụ web, có vẻ như chúng ta cần một số cách để phân biệt các kiến trúc dựa trên WSDL và SOAP, có thêm chi phí đáng kể và có thể phức tạp không cần thiết cho giao diện. Họ cũng yêu cầu các khung và công cụ phát triển bổ sung để thực hiện. Tôi không chắc chắn liệu REST có phải là thuật ngữ tốt nhất để phân biệt giữa các giao diện thông thường và các giao diện được thiết kế quá mức như WSDL và SOAP hay không. Nhưng chúng ta cần một cái gì đó.
REST là một mô hình kiến trúc và phong cách viết các ứng dụng phân tán. Nó không phải là một phong cách lập trình theo nghĩa hẹp.
Nói rằng bạn sử dụng phong cách REST tương tự như việc bạn xây dựng một ngôi nhà theo một phong cách cụ thể: ví dụ Tudor hoặc Victoria. Cả REST là kiểu phần mềm và Tudor hoặc Victoria là kiểu nhà đều có thể được xác định bởi các phẩm chất và ràng buộc tạo nên chúng. Ví dụ REST phải có phân tách Máy chủ Máy khách trong đó các thông báo tự mô tả. Các ngôi nhà theo phong cách Tudor có các đầu hồi chồng chéo và Mái nhà dốc thẳng với các đầu hồi phía trước. Bạn có thể đọc luận văn của Roy để tìm hiểu thêm về những hạn chế và phẩm chất tạo nên REST.
REST không giống như kiểu nhà đã có một thời gian khó khăn được áp dụng nhất quán và thực tế. Điều này có thể đã được cố ý. Để lại việc thực hiện thực tế của nó cho đến các nhà thiết kế. Vì vậy, bạn có thể tự do làm những gì bạn muốn miễn là bạn đáp ứng các ràng buộc được nêu trong luận án bạn đang tạo Hệ thống REST.
Tặng kem:
Toàn bộ web dựa trên REST (hoặc REST dựa trên web). Do đó, là một nhà phát triển web, bạn có thể muốn biết điều đó mặc dù không cần thiết phải viết các ứng dụng web tốt.
Đây là phác thảo cơ bản của tôi về REST. Tôi đã cố gắng thể hiện suy nghĩ đằng sau mỗi thành phần trong kiến trúc RESTful để hiểu khái niệm này trực quan hơn. Hy vọng rằng điều này sẽ giúp làm sáng tỏ REST cho một số người!
REST (Chuyển giao trạng thái đại diện) là một kiến trúc thiết kế phác thảo cách các tài nguyên được nối mạng (tức là các nút chia sẻ thông tin) được thiết kế và xử lý. Nói chung, kiến trúc RESTful làm cho nó để máy khách (máy yêu cầu) và máy chủ (máy phản hồi) có thể yêu cầu đọc, ghi và cập nhật dữ liệu mà không cần máy khách phải biết máy chủ hoạt động như thế nào và máy chủ có thể vượt qua nó trở lại mà không cần biết gì về khách hàng. Được rồi, tuyệt ... nhưng làm thế nào để chúng ta làm điều này trong thực tế?
Yêu cầu rõ ràng nhất là cần phải có một ngôn ngữ phổ quát nào đó để máy chủ có thể cho khách hàng biết họ đang cố gắng làm gì với yêu cầu và để máy chủ phản hồi.
Nhưng để tìm bất kỳ tài nguyên nào và sau đó cho khách hàng biết tài nguyên đó sống ở đâu, cần phải có một cách phổ quát để chỉ vào tài nguyên. Đây là nơi các Mã định danh tài nguyên chung (URI) xuất hiện; về cơ bản chúng là các địa chỉ duy nhất để tìm tài nguyên.
Nhưng kiến trúc REST không kết thúc ở đó! Mặc dù ở trên đáp ứng các nhu cầu cơ bản của những gì chúng tôi muốn, chúng tôi cũng muốn có một kiến trúc hỗ trợ lưu lượng lớn vì bất kỳ máy chủ nào cũng thường xử lý các phản hồi từ một số khách hàng. Do đó, chúng tôi không muốn áp đảo máy chủ bằng cách nhớ thông tin về các yêu cầu trước đó.
Do đó, chúng tôi áp đặt hạn chế rằng mỗi cặp phản hồi yêu cầu giữa máy khách và máy chủ là độc lập, có nghĩa là máy chủ không phải nhớ bất cứ điều gì về các yêu cầu trước đó (trạng thái tương tác giữa máy khách-máy chủ) để đáp ứng mới yêu cầu. Điều này có nghĩa là chúng tôi muốn các tương tác của chúng tôi là không trạng thái.
Để giảm bớt căng thẳng cho máy chủ của chúng tôi khỏi việc tính toán lại các tính toán đã được thực hiện gần đây cho một khách hàng nhất định, REST cũng cho phép lưu vào bộ đệm. Về cơ bản, bộ nhớ đệm có nghĩa là chụp ảnh phản hồi ban đầu được cung cấp cho khách hàng. Nếu khách hàng thực hiện lại yêu cầu tương tự, máy chủ có thể cung cấp cho khách hàng ảnh chụp nhanh thay vì làm lại tất cả các tính toán cần thiết để tạo phản hồi ban đầu. Tuy nhiên, vì là ảnh chụp nhanh, nếu ảnh chụp nhanh chưa hết hạn - máy chủ sẽ đặt trước thời gian hết hạn - và phản hồi đã được cập nhật kể từ bộ đệm ban đầu (nghĩa là yêu cầu sẽ đưa ra câu trả lời khác với phản hồi được lưu trong bộ nhớ cache) , khách hàng sẽ không thấy các bản cập nhật cho đến khi bộ đệm hết hạn (hoặc bộ đệm bị xóa) và phản hồi được hiển thị lại từ đầu.
Điều cuối cùng mà bạn thường ở đây về kiến trúc RESTful là chúng được xếp lớp. Chúng tôi thực sự đã thảo luận về yêu cầu này trong cuộc thảo luận về sự tương tác giữa máy khách và máy chủ. Về cơ bản, điều này có nghĩa là mỗi lớp trong hệ thống của chúng tôi chỉ tương tác với các lớp liền kề. Vì vậy, trong cuộc thảo luận của chúng tôi, lớp máy khách tương tác với lớp máy chủ của chúng tôi (và ngược lại), nhưng có thể có các lớp máy chủ khác giúp máy chủ chính xử lý yêu cầu mà máy khách không trực tiếp liên lạc. Thay vào đó, máy chủ chuyển yêu cầu khi cần thiết.
Bây giờ, nếu tất cả điều này nghe có vẻ quen thuộc, thì tuyệt vời. Giao thức truyền siêu văn bản (HTTP), định nghĩa giao thức giao tiếp qua World Wide Web là một triển khai khái niệm trừu tượng về kiến trúc RESTful (hoặc một thể hiện của lớp REST nếu bạn là người cuồng OOP như tôi). Trong triển khai REST này, máy khách và máy chủ tương tác thông qua GET, POST, PUT, DELETE, v.v., là một phần của ngôn ngữ phổ quát và các tài nguyên có thể được trỏ đến bằng cách sử dụng URL.
Tôi nghĩ rằng điểm đáng chú ý là sự tách biệt trạng thái thành một lớp cao hơn trong khi sử dụng internet (giao thức) như một lớp vận chuyển phi trạng thái . Hầu hết các cách tiếp cận khác trộn lẫn mọi thứ.
Đó là cách tiếp cận thực tế tốt nhất để xử lý những thay đổi cơ bản của lập trình trong thời đại internet. Về những thay đổi cơ bản, Erik Meijer có một cuộc thảo luận về chương trình tại đây: http://www.infoq.com/interviews/erik-meijer-programming-lingu-design-effects-purity#view_93197 . Ông tóm tắt nó như năm hiệu ứng, và trình bày một giải pháp bằng cách thiết kế giải pháp thành ngôn ngữ lập trình. Giải pháp, cũng có thể đạt được ở cấp độ nền tảng hoặc hệ thống, bất kể ngôn ngữ. Restful có thể được coi là một trong những giải pháp đã rất thành công trong thực tế hiện nay.
Với phong cách yên tĩnh, bạn có được và điều khiển trạng thái của ứng dụng trên một mạng internet không đáng tin cậy. Nếu nó không hoạt động hiện tại để có được trạng thái chính xác và hiện tại, nó cần hiệu trưởng xác thực bằng không để giúp ứng dụng tiếp tục. Nếu nó không thao túng trạng thái, nó thường sử dụng nhiều giai đoạn xác nhận để giữ cho mọi thứ chính xác. Theo nghĩa này, phần còn lại không phải là một giải pháp toàn bộ, nó cần các chức năng trong phần khác của ngăn xếp ứng dụng web để hỗ trợ hoạt động của nó.
Với quan điểm này, phong cách còn lại không thực sự gắn liền với internet hoặc ứng dụng web. Đó là một giải pháp cơ bản cho nhiều tình huống lập trình. Nó cũng không đơn giản, nó chỉ làm cho giao diện thực sự đơn giản, và đối phó với các công nghệ khác rất tốt.
Chỉ cần 2c của tôi.
Chỉnh sửa: Hai khía cạnh quan trọng hơn:
Không quốc tịch là sai lệch. Đó là về API yên tĩnh, không phải ứng dụng hoặc hệ thống. Hệ thống cần phải có trạng thái. Thiết kế yên tĩnh là về thiết kế một hệ thống trạng thái dựa trên API không trạng thái. Một số trích dẫn từ QA khác :
Đây là "cuộc thảo luận" dài đáng kinh ngạc và khá khó hiểu để nói ít nhất.
IMO:
1) Không có thứ gọi là lập trình yên tĩnh, không có khớp lớn và nhiều bia :)
2) Chuyển giao trạng thái đại diện (REST) là một kiểu kiến trúc được chỉ định trong luận án của Roy Fielding . Nó có một số hạn chế. Nếu Dịch vụ / Khách hàng của bạn tôn trọng những thứ đó thì đó là RESTful. Đây là nó.
Bạn có thể tóm tắt (đáng kể) các ràng buộc đối với:
Có một bài viết rất hay giải thích những điều độc đáo.
Rất nhiều câu trả lời sao chép / dán thông tin hợp lệ trộn nó và thêm một số nhầm lẫn. Mọi người nói ở đây về các cấp độ, về các URI RESTFul (không có vấn đề nào như vậy!), Áp dụng các phương thức HTTP GET, POST, PUT ... REST không phải là về điều đó hay không chỉ về điều đó.
Ví dụ: liên kết - thật tuyệt khi có API trông đẹp mắt nhưng cuối cùng, máy khách / máy chủ không thực sự quan tâm đến các liên kết bạn nhận / gửi, đó là nội dung quan trọng.
Cuối cùng, bất kỳ máy khách RESTful nào cũng có thể sử dụng cho bất kỳ dịch vụ RESTful nào miễn là định dạng nội dung được biết đến.
Câu hỏi cũ, cách trả lời mới. Có rất nhiều quan niệm sai lầm về khái niệm này. Tôi luôn cố gắng ghi nhớ:
Tôi định nghĩa lập trình yên tĩnh là
Một ứng dụng rất yên tĩnh nếu nó cung cấp tài nguyên (là sự kết hợp của các điều khiển chuyển đổi trạng thái + dữ liệu) trong một loại phương tiện mà khách hàng hiểu
Để trở thành một lập trình viên yên tĩnh, bạn phải cố gắng xây dựng các ứng dụng cho phép các diễn viên thực hiện mọi việc. Không chỉ phơi bày cơ sở dữ liệu.
Các điều khiển chuyển trạng thái chỉ có ý nghĩa nếu máy khách và máy chủ đồng ý với cách biểu diễn loại tài nguyên của phương tiện. Mặt khác, không có cách nào để biết điều khiển là gì và điều gì không và cách thực hiện điều khiển. IE nếu trình duyệt không biết <form>
thẻ trong html thì sẽ không có gì để bạn gửi đến trạng thái chuyển tiếp trong trình duyệt của bạn.
Tôi không muốn tự quảng bá, nhưng tôi mở rộng những ý tưởng này đến chiều sâu trong bài nói chuyện của mình http://techblog.bodybuilding.com/2016/01/video-what-is-restful-200.html .
Một đoạn trích từ bài nói chuyện của tôi là về mô hình trưởng thành thường được nhắc đến của richardson, tôi không tin vào các cấp độ, bạn là RESTful (cấp 3) hoặc bạn thì không, nhưng điều tôi muốn gọi là về mỗi cấp độ làm cho bạn trên đường đến RESTful
REST định nghĩa 6 ràng buộc kiến trúc tạo nên bất kỳ dịch vụ web nào - API RESTful thực sự .
REST === Tương tự HTTP là không chính xác cho đến khi bạn không nhấn mạnh đến thực tế rằng nó "PHẢI" được điều khiển HATEOAS .
Chính Roy đã xóa nó ở đây .
Nên nhập API REST mà không có kiến thức trước ngoài URI (dấu trang) ban đầu và tập hợp các loại phương tiện được tiêu chuẩn hóa phù hợp với đối tượng dự định (nghĩa là, bất kỳ khách hàng nào có thể sử dụng API đều hiểu). Từ thời điểm đó, tất cả các chuyển đổi trạng thái ứng dụng phải được điều khiển bởi lựa chọn máy khách do các lựa chọn do máy chủ cung cấp có trong các biểu diễn nhận được hoặc ngụ ý bởi thao tác của người dùng đối với các biểu diễn đó. Việc chuyển đổi có thể được xác định (hoặc giới hạn bởi) kiến thức của khách hàng về các loại phương tiện và cơ chế truyền thông tài nguyên, cả hai đều có thể được cải thiện nhanh chóng (ví dụ: mã theo yêu cầu).
[Thất bại ở đây ngụ ý rằng thông tin ngoài băng tần đang thúc đẩy sự tương tác thay vì siêu văn bản.]
REST là một kiểu kiến trúc dựa trên các tiêu chuẩn web và giao thức HTTP (được giới thiệu vào năm 2000).
Trong kiến trúc dựa trên REST, mọi thứ đều là tài nguyên (Người dùng, Đơn hàng, Nhận xét). Một tài nguyên được truy cập thông qua một giao diện chung dựa trên các phương thức tiêu chuẩn HTTP (GET, PUT, PATCH, DELETE, v.v.).
Trong kiến trúc dựa trên REST, bạn có một máy chủ REST cung cấp quyền truy cập vào các tài nguyên. Một máy khách REST có thể truy cập và sửa đổi các tài nguyên REST.
Mọi tài nguyên nên hỗ trợ các hoạt động chung HTTP. Tài nguyên được xác định bởi ID toàn cầu (thường là URI).
REST cho phép các tài nguyên có các biểu diễn khác nhau, ví dụ: văn bản, XML, JSON, v.v ... Máy khách REST có thể yêu cầu một biểu diễn cụ thể thông qua giao thức HTTP (đàm phán nội dung).
Phương thức HTTP:
Các phương thức PUT, GET, POST và DELETE được sử dụng điển hình trong các kiến trúc dựa trên REST. Bảng dưới đây đưa ra lời giải thích về các hoạt động này.
REST là viết tắt của chuyển trạng thái đại diện .
Nó dựa trên một giao thức truyền thông không thể lưu trữ, máy khách-máy chủ, không lưu trữ - và trong hầu hết mọi trường hợp, giao thức HTTP được sử dụng.
REST thường được sử dụng trong các ứng dụng di động, trang web mạng xã hội, công cụ mashup và quy trình kinh doanh tự động. Kiểu REST nhấn mạnh rằng sự tương tác giữa khách hàng và dịch vụ được tăng cường bằng cách giới hạn số lượng hoạt động (động từ). Tính linh hoạt được cung cấp bằng cách gán các tài nguyên (danh từ) các chỉ số tài nguyên phổ quát (URI) riêng của chúng.
Nói chuyện không chỉ đơn giản là trao đổi thông tin . Một giao thức được thiết kế thực sự để không xảy ra nói chuyện. Mỗi bên đều biết công việc cụ thể của họ là gì vì nó được chỉ định trong giao thức. Các giao thức cho phép trao đổi thông tin thuần túy với chi phí có bất kỳ thay đổi nào trong các hành động có thể. Nói chuyện, mặt khác, cho phép một bên hỏi những hành động nào khác có thể được thực hiện từ bên kia. Họ thậm chí có thể hỏi cùng một câu hỏi hai lần và nhận được hai câu trả lời khác nhau, vì Nhà nước của bên kia có thể đã thay đổi tạm thời. Nói là kiến trúc RESTful . Luận án của Fielding chỉ định kiến trúc mà người ta sẽ phải tuân theo nếu muốn cho phép máy móc nói chuyện với nhau chứ không chỉ đơn giản làgiao tiếp .
Không có khái niệm như "lập trình RESTful" mỗi se. Nó sẽ được gọi là mô hình RESTful tốt hơn hoặc kiến trúc RESTful thậm chí tốt hơn. Nó không phải là một ngôn ngữ lập trình. Đó là một mô hình.
Trong điện toán, chuyển trạng thái đại diện (REST) là một kiểu kiến trúc được sử dụng để phát triển web.
Điểm còn lại là nếu chúng ta đồng ý sử dụng ngôn ngữ chung cho các hoạt động cơ bản (động từ http), cơ sở hạ tầng có thể được cấu hình để hiểu chúng và tối ưu hóa chúng đúng cách, ví dụ, bằng cách sử dụng các tiêu đề bộ đệm để thực hiện lưu trữ bộ đệm cấp độ.
Với thao tác GET được thực hiện đúng cách, sẽ không có vấn đề gì nếu thông tin đến từ DB máy chủ của bạn, memcache của máy chủ, CDN, bộ đệm của proxy, bộ đệm của trình duyệt hoặc bộ nhớ cục bộ của trình duyệt. Có thể sử dụng nguồn cập nhật nhanh nhất, sẵn có nhất có thể được sử dụng.
Nói rằng Rest chỉ là một thay đổi cú pháp từ việc sử dụng các yêu cầu GET với tham số hành động sang sử dụng các động từ http có sẵn làm cho nó trông giống như nó không có lợi ích và hoàn toàn là mỹ phẩm. Vấn đề là sử dụng một ngôn ngữ có thể được hiểu và tối ưu hóa bởi mọi phần của chuỗi. Nếu thao tác GET của bạn có hành động với các tác dụng phụ, bạn phải bỏ qua tất cả bộ đệm HTTP hoặc bạn sẽ có kết quả không nhất quán.
Kiểm tra API là gì?
Kiểm tra API sử dụng lập trình để gửi các cuộc gọi đến API và nhận được kết quả. Nó kiểm tra liên quan đến phân khúc được thử nghiệm như một hộp đen. Mục tiêu của kiểm tra API là xác nhận thực hiện đúng và xử lý sai lầm của phần trước khi phối hợp thành một ứng dụng.
API REST
REST: Chuyển giao nhà nước đại diện.
4 Phương thức API thường được sử dụng: -
Các bước để kiểm tra API theo cách thủ công: -
Để sử dụng API theo cách thủ công, chúng tôi có thể sử dụng các trình cắm API REST dựa trên trình duyệt.
Điều này rất ít được đề cập ở khắp mọi nơi, nhưng Mô hình trưởng thành của Richardson là một trong những phương pháp tốt nhất để thực sự đánh giá API của Restful như thế nào. Thêm về nó ở đây:
Tôi muốn nói rằng một khối xây dựng quan trọng trong việc hiểu REST nằm ở các điểm cuối hoặc ánh xạ, chẳng hạn như /customers/{id}/balance
.
Bạn có thể tưởng tượng một điểm cuối như là đường ống kết nối từ trang web (front-end) đến cơ sở dữ liệu / máy chủ của bạn (back-end). Sử dụng chúng, front-end có thể thực hiện các hoạt động back-end được xác định trong các phương thức tương ứng của bất kỳ ánh xạ REST nào trong ứng dụng của bạn.