Một số khái niệm liên quan đến xung đột REST trong đầu khi tôi thử thực hiện nó.
Tôi có một hệ thống API back-end REST-Ful chứa logic nghiệp vụ và một ứng dụng web cung cấp UI. Từ các tài nguyên khác nhau về REST (đặc biệt, REST trong Thực hành: Hypermedia và Kiến trúc hệ thống ) Tôi biết rằng tôi không nên phơi bày các định danh thô của các thực thể của mình, mà nên trả về các siêu liên kết rel="self"
.
Hãy xem xét ví dụ. Api REST có tài nguyên trả về một người:
<Person>
<Links>
<Link rel="self" href="http://my.rest.api/api/person/1234"/>
</Links>
<Pets>
<Link rel="pet" href="http://my.rest.api/api/pet/678"/>
</Pets>
</Person>
Vấn đề phát sinh với ứng dụng web. Giả sử nó trả về một trang có chứa một siêu liên kết đến các trình duyệt:
<body class="person">
<p>
<a href="http://my.web.app/pet/???????" />
</p>
</body>
Tôi nên đặt gì vào href
thuộc tính? Làm cách nào để giữ URL thực thể API trong ứng dụng web để có thể nhận thực thể khi người dùng mở trang đích?
Các yêu cầu có vẻ mâu thuẫn:
- Các siêu liên kết
href
sẽ dẫn đến ứng dụng web vì đó là hệ thống lưu trữ giao diện người dùng - Các
href
nên có một số id của thực thể bởi vì các ứng dụng web phải có khả năng giải quyết các thực thể khi trang mục tiêu mở - Ứng dụng web không nên phân tích / xây dựng các URL REST vì nó không phải là REST-Ful, Cuốn sách được đề cập nói
URI phải mờ đục đối với người tiêu dùng. Chỉ người phát hành URI mới biết cách diễn giải nó và ánh xạ nó tới một tài nguyên.
Vì vậy, tôi không thể lấy 1234
từ URL phản hồi API vì với tư cách là khách hàng RESTful, tôi nên coi nó như thể nó giống như thế http://my.rest.api/api/AGRIDd~ryPQZ^$RjEL0j
. Mặt khác, tôi phải cung cấp một số URL dẫn đến ứng dụng web của mình và đủ để ứng dụng khôi phục URL gốc của API và sử dụng URL đó để truy cập tài nguyên API.
Cách đơn giản nhất có lẽ chỉ là sử dụng URL tài nguyên API làm định danh chuỗi của chúng. Nhưng các trang web như url http://my.web.app/person/http%3A%2F%2Fmy.rest.api%2Fapi%2Fperson%2F1234
là xấu xí.
Tất cả có vẻ khá dễ dàng đối với một ứng dụng máy tính để bàn hoặc ứng dụng javascript một trang. Vì chúng sống liên tục, chúng chỉ có thể giữ các URL trong bộ nhớ cùng với các đối tượng dịch vụ trong suốt vòng đời của ứng dụng và sử dụng chúng khi cần thiết.
Với một ứng dụng web tôi có thể tưởng tượng ra một số cách tiếp cận, nhưng tất cả đều có vẻ kỳ lạ:
- Thay thế máy chủ lưu trữ trong các URL API và chỉ giữ lại kết quả. Nhược điểm rất lớn là nó yêu cầu ứng dụng web xử lý bất kỳ URL nào mà API tạo ra, nghĩa là khớp nối quái dị. Hơn nữa, nó không phải là RESTful nữa, vì ứng dụng web của tôi bắt đầu diễn giải các URL.
- Đưa ra các id thô trong API REST cùng với các liên kết, sử dụng chúng để xây dựng URL của Ứng dụng web và sau đó sử dụng id trên máy chủ ứng dụng web để tìm tài nguyên cần thiết trong API. Điều này tốt hơn, nhưng sẽ ảnh hưởng đến hiệu suất của máy chủ ứng dụng web vì ứng dụng web sẽ phải thông qua điều hướng dịch vụ REST đưa ra một chuỗi các yêu cầu get-by-id dưới dạng nào đó để xử lý bất kỳ yêu cầu nào từ trình duyệt. Đối với một tài nguyên hơi lồng nhau, điều này có thể tốn kém.
- Lưu trữ tất cả các
self
URL được trả lại bởi api trong ánh xạ liên tục (DB?) Trên máy chủ ứng dụng web. Tạo một số id cho chúng, sử dụng id để xây dựng URL của trang ứng dụng web và để lấy URL của tài nguyên dịch vụ REST. Tức là tôi giữhttp://my.rest.api/pet/678
URL ở đâu đó bằng một khóa mới, giả sử3
và tạo URL trang web dưới dạnghttp://my.web.app/pet/3
. Điều này trông giống như một triển khai HTTP Cache của một số loại. Tôi không biết tại sao, nhưng nó có vẻ kỳ lạ với tôi.
Hoặc tất cả có nghĩa là API RESTful không thể phục vụ như phụ trợ cho các ứng dụng web?