2010-08-11 43 views
6

Một phần của API RESTful của chúng tôi sẽ cho phép người dùng đăng ký một mục với số sê-ri. Vì số sê-ri không phải là số duy nhất trên toàn cầu, nó không thể được sử dụng làm mã định danh của tài nguyên, vì vậy chúng tôi sẽ sử dụng POST cho tài nguyên chính sẽ tạo một số nhận dạng, ví dụ:Trả lời yêu cầu HTTP POST không cần thiết

POST /my/items 

<item serial-number="ABCDEF" /> 

Trong trường hợp mục chưa được đăng ký, ngữ nghĩa HTTP được xác định rõ. Chúng tôi trả lại tiêu đề Vị trí và mục đã đăng ký làm nội dung thực thể, ví dụ:

HTTP 201 Created 
Location: /my/items/1234  

<item id="1234" serial-number="ABCDEF" /> 

Tuy nhiên, trong trường hợp mục này đã được đăng ký, API phải là không cần thiết và trả lại mục đã đăng ký trước đó mà không tạo mục mới. Dự đoán tốt nhất của tôi là sau đó nó sẽ trả lại mã trạng thái 200 OK và sử dụng tiêu đề Content-Location để cho biết mục thực sự đến từ đâu, ví dụ:

HTTP 200 OK 
Content-Location: /my/items/1234  

<item id="1234" serial-number="ABCDEF" /> 

Điều này có vẻ hợp lý không? Tôi không hoàn toàn rõ ràng liệu Vị trí hoặc Nội dung có phù hợp hơn trong trường hợp thứ hai hay không.

Trả lời

7

Gần đây tôi đã có yêu cầu tương tự. Đối với các hoạt động idempotent PUT là cách tốt nhất. Bạn đang phải có một sự không phù hợp giữa id bên ngoài và bên trong. Tôi giải quyết nó bằng cách tạo ra một nguồn lực dành riêng cho id mục tiêu bên ngoài:

PUT /api-user/{username}/items/{serialNumber} 

Bên trong tôi giải quyết nó như là một CREATE trong trường hợp tôi không có mục cho 'username' và số serial hoặc UPDATE 'ABCDEF' trong trường hợp tôi làm .

Trong trường hợp CREATE tôi trả về 201 cho CẬP NHẬT 200. Hơn nữa, tải trọng trả về chứa cả id homegrown và số sê-ri bên ngoài như bạn đã đề xuất trong tải trọng của mình.

+0

Hmmm có thực sự tôi như thế này. Mặc dù các số sê-ri có thể không phải là duy nhất trên toàn cầu, nhưng xác suất gần như 100% sẽ là duy nhất trong phạm vi của người dùng để nó có thể hoạt động như một số nhận dạng duy nhất. Nó cũng sẽ giải quyết vấn đề của tôi như thế nào một thiết bị có thể kiểm tra xem nó đã được đăng ký bằng cách sử dụng GET trên URL này và kiểm tra xem phản ứng là 200 hay 404. Cảm ơn! –

1

Here là một cuộc thảo luận thú vị về cách sử dụng hai tiêu đề. Xác nhận quyền sở hữu Nội dung không được xác định cho PUT hoặc POST nên Vị trí có thể là lựa chọn tốt hơn trong trường hợp của bạn. Nó chắc chắn không phải là cắt rõ ràng đó là tốt hơn mặc dù.

Nhìn chung, tôi nghĩ rằng cách tiếp cận của bạn có ý nghĩa.

+0

Bài viết đó bị thiếu một chút khi nói Nội dung-Vị trí không được xác định cho PUT và POST, thông số HTTP thực sự cho biết nó không được xác định cho các yêu cầu nhưng không nói gì về câu trả lời. Tôi nghĩ rằng nó có thể là mặc dù trong nói rằng Content-Địa điểm là cho các hình thức thay thế, trong khi Địa điểm là vị trí thực tế. Khó khăn để chắc chắn từ spec: -S –

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