Có thể hiểu được một chút bối rối về cách sử dụng REST đúng cách dựa trên tất cả các cách tôi đã thấy các công ty lớn thiết kế API REST của họ.
Bạn đúng ở chỗ REST là một hệ thống thu thập tài nguyên. Nó là viết tắt của Chuyển giao Nhà nước Đại diện. Không phải là một định nghĩa tuyệt vời nếu bạn hỏi tôi. Nhưng các khái niệm chính là 4 ĐỘNG TỪ HTTP và không trạng thái.
Điều quan trọng cần lưu ý là bạn chỉ có 4 ĐỘNG TỪ với REST. Đây là NHẬN, POST, PUT và XÓA. resend
Ví dụ của bạn sẽ thêm một Động từ mới vào REST. Đây phải là một lá cờ đỏ.
Câu hỏi 1
Điều quan trọng là phải nhận ra rằng người gọi API REST của bạn không cần phải biết rằng việc thực hiện một PUT
bộ sưu tập của bạn sẽ dẫn đến một e-mail được tạo. Điều đó có mùi của một rò rỉ với tôi. Những gì họ có thể biết là việc thực hiện PUT
có thể dẫn đến các nhiệm vụ bổ sung mà họ có thể truy vấn sau này. Họ sẽ biết điều này bằng cách thực hiện một GET
tài nguyên được tạo gần đây. Điều đó GET
sẽ trả về tài nguyên và tất cả các Task
id tài nguyên được liên kết với nó. Sau đó, bạn có thể truy vấn các tác vụ đó để xác định trạng thái của chúng và thậm chí gửi mới Task
.
Bạn có một vài lựa chọn.
REST - Cách tiếp cận dựa trên tài nguyên nhiệm vụ
Tạo một tasks
tài nguyên trong đó bạn có thể gửi các tác vụ cụ thể vào hệ thống của mình để thực hiện các hành động. Sau đó, bạn có thể thực GET
hiện tác vụ dựa trên tác vụ được ID
trả về để xác định trạng thái của nó.
Hoặc bạn có thể kết hợp trong SOAP over HTTP
Dịch vụ web để thêm một số RPC vào kiến trúc của bạn.
truy vấn cho tất cả các nhiệm vụ cho một tài nguyên cụ thể
GET http://server/api/myCollection/123/tasks
{ "tasks" :
[ { "22333" : "http://server/api/tasks/223333" } ]
}
ví dụ tài nguyên nhiệm vụ
PUT http://server/api/tasks
{
"type" : "send-email" ,
"parameters" :
{
"collection-type" : "foo" ,
"collection-id" : "123"
}
}
==> trả về id của nhiệm vụ
223334
GET http://server/api/tasks/223334
{
"status" : "complete" ,
"date" : "whenever"
}
REST- Sử dụng POST để kích hoạt các hành động
Bạn luôn có thể POST
bổ sung dữ liệu vào tài nguyên. Theo tôi điều này sẽ vi phạm tinh thần của REST nhưng nó vẫn tuân thủ.
Bạn có thể thực hiện một POST tương tự như thế này:
POST http://server/api/collection/123
{ "action" : "send-email" }
Bạn sẽ cập nhật tài nguyên 123 từ bộ sưu tập với dữ liệu bổ sung. Dữ liệu bổ sung đó thực chất là một hành động yêu cầu phụ trợ gửi email cho tài nguyên đó.
Vấn đề tôi gặp phải là vấn đề GET
tài nguyên sẽ trả về dữ liệu cập nhật này. Tuy nhiên, điều này sẽ giải quyết các yêu cầu của bạn và vẫn là RESTful.
SOAP - Dịch vụ web chấp nhận tài nguyên thu được từ REST
Tạo một Dịch vụ web mới trong đó bạn có thể gửi e-mail dựa trên ID tài nguyên trước đó từ API REST. Tôi sẽ không đi sâu vào chi tiết về SOAP ở đây vì câu hỏi ban đầu là về REST và hai khái niệm / công nghệ này không nên được so sánh vì đó là Táo và Cam .
Câu hỏi 2
Bạn cũng có một vài lựa chọn ở đây:
Dường như nhiều công ty lớn hơn xuất bản API REST trưng bày search
bộ sưu tập thực sự chỉ là một cách để truyền tham số truy vấn để trả về tài nguyên.
GET http://server/api/search?q="type = myCollection & someField >= someval"
Cái nào sẽ trả về một tập hợp các tài nguyên REST đủ điều kiện, chẳng hạn như:
{
"results" :
{ [
"location" : "http://server/api/myCollection/1",
"location" : "http://server/api/myCollection/9",
"location" : "http://server/api/myCollection/56"
]
}
}
Hoặc bạn có thể cho phép một cái gì đó như MVEL làm tham số truy vấn.
Câu 3
Tôi thích các cấp phụ hơn là phải quay lại và truy vấn tài nguyên khác bằng một tham số truy vấn. Tôi không tin có bất kỳ quy tắc nào bằng cách này hay cách khác. Bạn có thể thực hiện cả hai cách và cho phép người gọi quyết định cách nào phù hợp hơn dựa trên cách họ lần đầu tiên nhập vào hệ thống.
Ghi chú
Tôi không đồng ý về những bình luận dễ đọc từ người khác. Mặc dù những gì một số người có thể nghĩ rằng REST vẫn không dành cho con người. Đó là cho tiêu thụ máy. Nếu tôi muốn xem Tweets của mình, tôi sử dụng trang web Twitters thường xuyên. Tôi không thực hiện REST GET với API của họ. Nếu tôi muốn lập trình một cái gì đó với các tweet của mình thì tôi sử dụng API REST của họ. Có API nên dễ hiểu, nhưng gte
không phải là xấu, nó không trực quan.
Điều chính khác với REST là bạn sẽ có thể bắt đầu tại bất kỳ điểm cung cấp nào trong API của mình và điều hướng đến tất cả các tài nguyên được liên kết khác mà KHÔNG biết URL chính xác của các tài nguyên khác trước thời hạn. Kết quả của GET
ĐỘNG TỪ trong REST sẽ trả về URL REST đầy đủ của các tài nguyên mà nó tham chiếu. Vì vậy, thay vì truy vấn trả về ID của một Person
đối tượng, nó sẽ trả về URL đủ điều kiện, chẳng hạn như http://server/api/people/13
. Sau đó, bạn luôn có thể điều hướng kết quả theo chương trình ngay cả khi URL thay đổi.
Trả lời bình luận
Trong thế giới thực, thực tế có những thứ cần phải xảy ra mà không tạo, đọc, cập nhật hoặc xóa (CRUD) một tài nguyên.
Các hành động bổ sung có thể được thực hiện trên các tài nguyên. Cơ sở dữ liệu quan hệ điển hình hỗ trợ khái niệm Thủ tục lưu trữ. Đây là các lệnh bổ sung có thể được thực thi trên một tập hợp dữ liệu. REST vốn không có khái niệm đó. Và không có lý do gì nó nên. Các loại hành động này là hoàn hảo cho RPC hoặc SOAP Web Services.
Đây là vấn đề chung tôi thấy với các API REST. Các nhà phát triển không thích các giới hạn về khái niệm bao quanh REST để họ điều chỉnh nó để làm bất cứ điều gì họ muốn. Điều đó phá vỡ nó từ một dịch vụ RESTful mặc dù. Về cơ bản, các URL đó trở thành GET
các lệnh gọi trên các máy chủ giống như REST.
Bạn có một vài lựa chọn:
- Tạo một tài nguyên nhiệm vụ
- Hỗ trợ
POST
ing dữ liệu bổ sung vào tài nguyên để thực hiện một hành động.
- Thêm các lệnh bổ sung thông qua Dịch vụ web SOAP.
Nếu bạn đã sử dụng một tham số truy vấn mà HTTP VerB bạn sẽ sử dụng để gửi lại email?
GET
- Điều này có gửi lại email VÀ trả lại dữ liệu của tài nguyên không? Điều gì xảy ra nếu một hệ thống lưu trữ URL đó và coi nó như URL duy nhất cho tài nguyên đó. Mỗi lần họ nhấn URL, nó sẽ gửi lại một email.
POST
- Bạn thực sự không gửi bất kỳ dữ liệu mới nào đến tài nguyên, chỉ là một tham số truy vấn bổ sung.
Dựa trên tất cả các yêu cầu đã cho, thực hiện một POST
tài nguyên với action field
dữ liệu POST sẽ giải quyết vấn đề.