2009-08-08 40 views
10

Ok, đây là sự thật. StackOverflow được triển khai theo kiểu REST. Khi bạn truy cập một câu hỏi cụ thể/$ id/URL bạn có thể xem câu hỏi. Nội dung được trả về trong HTML vì đó là những gì trình duyệt hiểu.REST và nhiều định dạng dữ liệu

Tôi phải phát triển dịch vụ REST của riêng mình. Thực tế là tôi phải trả về nhiều định dạng cho cùng một thông tin. Ví dụ, mặc định có thể là HTML, nhưng tôi cũng có thể trả về một XML hoặc một JSON.

Câu hỏi là: phong cách được đề xuất để đạt được điều này là gì? Ba lựa chọn (thêm từ gợi ý hữu ích của bạn)

  1. tùy chọn trong URL (ví dụ http://example.com/questions/12345/?format=json)
  2. giao diện khác nhau (ví dụ: đối với dữ liệu json bạn có http://example.com/questions/1234/json/ hoặc http://example.com/json/questions/12345/, cho dữ liệu xml bạn có http://example.com/questions/1234/xml/ vv ... bạn sẽ có được điểm) tiêu đề
  3. http Chấp nhận: application/json

Tương tự là cho PUT) hoạt động POST (. Nếu tôi muốn gửi dữ liệu ở các định dạng khác nhau, tôi cần thông báo cho người nhận định dạng mà tôi đang cung cấp, vì vậy tình huống tương tự (và câu hỏi) được giữ.

Cảm ơn!

Sửa: đề nghị bổ sung như sau

4) Chỉ định một địa chỉ URL thích hợp cho mỗi định dạng ví dụ http://example.com/questions/12345.json. Điều này có vẻ tốt đẹp, nhưng điều này có nghĩa là, để nhất quán, chúng ta cũng nên có http://example.com/questions/12345.html? âm thanh như vậy năm 1995 ... :)

PS: Tôi ghét đánh dấu đưa một thứ tự tùy ý vào danh sách. Nếu tôi muốn bắt đầu với 4, tôi sẽ có thể làm điều đó.

+0

Câu hỏi tương tự: http://stackoverflow.com/questions/381568/rest-content-type-should-it-be-based-on-extension-or-accept-header –

+1

Có, gần như trùng lặp, nhưng là nó đứng, nó ít trực tiếp hơn tôi. Hy vọng rằng, câu hỏi này sẽ mang lại nhiều lợi ích hơn cho các googlers. –

+1

Các lược đồ đặt tên URI và các URI lồng nhau hoàn toàn không liên quan gì đến REST. Nếu bạn có thể dựa vào việc sửa đổi các phần của URI để truy cập các tài nguyên có thể dự đoán được, rất có thể đó chỉ là RPC, chứ không phải REST. – aehlke

Trả lời

4

Tôi sẽ sử dụng Tùy chọn 1 (tham số URL) vì nó phù hợp nhất với các nguyên tắc của REST và thực dụng nhất.

Tùy chọn 2 có mùi xấu - bạn đang nói về các biểu diễn khác nhau của cùng một tài nguyên, vì vậy bạn nên sử dụng cùng một URI cho chúng.

Tùy chọn 3 ngăn xếp quá khó kiểm soát - ví dụ: bạn sẽ tự kiểm tra nó như thế nào trong trình duyệt của mình?

(Những lập luận tương tự áp dụng cho PUT/POST.)

+0

Cảm ơn. Bạn có nghĩ rằng sẽ tốt hơn nếu chỉ định một chuỗi đơn giản (format = json) hoặc mime-type (format = application/json)? –

+2

Tôi không đồng ý với khẳng định rằng tùy chọn số 1 là RESTful nhất. Bạn có thể xây dựng trên lý luận của bạn? :) –

+0

@Stefano: Tôi sẽ giữ cho nó đơn giản: 'format = json' – RichieHindle

2

Nó không quan trọng dù chỉ một chút giữa 1. và 2. Một URI là đục, vì vậy từ phần giao diện REST của nó, không có Sự khác biệt.

Từ góc độ lưu trong bộ nhớ cache, 1. sẽ ngăn không cho nhiều bộ nhớ cache thực hiện công việc của họ.

  1. là tốt nếu bạn muốn làm conneg chống lại nhiều represetnaitons.

Thông thường, mọi người sử dụng conneg với tiêu đề Chấp nhận, có thể có chuyển hướng đến URI đủ điều kiện sử dụng/khách hàng/21.json

23

Tùy chọn # 3, đặt tiêu đề HTTP "Chấp nhận", phù hợp hơn với đặc tả HTTP và trong số các người thuần túy REST, được coi là chính xác nhất. Nó cũng có nghĩa là bạn giữ cùng một URL (tài nguyên) bất kể biểu diễn là gì.

Tuy nhiên, bạn có thể gặp phải các tác nhân người dùng không có khả năng đặt tiêu đề Chấp nhận, vì vậy hỗ trợ cơ chế sao lưu để chỉ định định dạng phản hồi là được khuyến khích. Trong trường hợp đó, tôi đề xuất một tham số chuỗi truy vấn URL. Sử dụng tham số chuỗi truy vấn URL có nghĩa là bạn giữ nguyên URL chính, bất kể loại nội dung được trả về. Điều này làm cho nó rõ ràng hơn rằng khách hàng chỉ nên phát hành một PUT cho URL đó chứ không phải cho các URL /foo/bar.json hoặc /foo/bar.xml.

Chỉnh sửa: Một điều cần xem xét nếu bạn quyết định đi với hậu tố URL (tức là foo.json so với foo? Format = json) là bạn có thể gặp phải sự cố với proxy caching. Nếu ai đó đưa ra một PUT tới /foo.json, một proxy sẽ không giải thích rằng đó là một yêu cầu để vô hiệu hóa /foo.xml. Tuy nhiên, nếu bạn sử dụng/foo? Format = json, thì tất cả được lưu trữ dưới cùng một tài nguyên (/ foo) trong proxy.

+0

Phần lớn cache của AFAIK sẽ đơn giản bỏ qua bất kỳ URI nào bao gồm chuỗi truy vấn, thay vì tách URI thành cơ sở của nó và lưu trữ nó. – aehlke

Các vấn đề liên quan