2012-12-12 27 views
5

Tôi hiện đang xây dựng một Web API và có một kịch bản cụ thể mà tôi không thể xác định Mã trạng thái HTTP nào thích hợp nhất để trả lại.Không thể xóa liên hệ cuối cùng - Mã trạng thái Http nào?

Các Kịch bản

Tôi có một "khách hàng" tài nguyên công ty sở hữu một bộ sưu tập các tài nguyên liên lạc.

Sự bất biến là khách hàng phải luôn có ít nhất một liên hệ. Do đó, nếu một yêu cầu được thực hiện để xóa một liên hệ và liên hệ này là liên hệ còn lại cuối cùng cho khách hàng đã cho, tôi cần trả lại phản hồi HTTP thích hợp cho biết yêu cầu không thể được thực hiện khi bạn "Không thể xóa địa chỉ liên hệ cuối cùng".

Cảm giác của tôi là thế này nên thuộc loại "4xx Khách hàng Lỗi của"

Tôi đã xem xét các mã trạng thái sau:

400 Bad Request - Tôi đã cai trị này ra vì nó là cụ thể liên quan đến yêu cầu không đúng định dạng trong đó máy chủ không thể hiểu được.

405 Phương pháp không được phép - lúc đầu điều này có vẻ phù hợp, nhưng tôi nghĩ 405 cho biết phương pháp này không bao giờ được phép, tuy nhiên kịch bản trên chỉ thoáng qua. Suy nghĩ?

409 Xung đột - Tôi đã hướng tới điều này, tuy nhiên, ví dụ phổ biến nhất cho mã này thường là một xung đột ngoại lệ/chỉnh sửa đồng thời.

Có ai có bất kỳ hướng dẫn nào về cách tôi phản hồi trong trường hợp này không?

+0

'409' nhận được phiếu bầu của tôi trong trường hợp này, vì đó là xung đột mà người dùng có thể giải quyết. Rằng ví dụ phổ biến là cái gì khác không quan trọng với tôi, các ví dụ khác như thế này tồn tại. '400' là đúng, nhưng có điều gì đó để nói cho'405' nếu bạn sử dụng các yêu cầu' DELETE' thực tế ... Nếu không, 409 tôi nói, nhưng nếu bạn làm ... tôi thấy tình huống khó xử của bạn. – Wrikken

+0

Vâng, tôi đang sử dụng động từ DELETE ở đây, nhưng tôi nghĩ 405 cho biết Phương thức nên _never_ được phép trên tài nguyên đã cho. –

Trả lời

7

Điều quan trọng là xem xét sự mong đợi của khách hàng và lưu trữ khi một mã trạng thái cụ thể được sử dụng.

Dưới đây là một số khối của RFC2616 mà có ích để xem xét:

10.4.1. 400 Yêu cầu không hợp lệ

Máy chủ không thể hiểu yêu cầu do cú pháp không đúng định dạng. Khách hàng KHÔNG NÊN lặp lại yêu cầu mà không sửa đổi.

Điều này cho biết rằng yêu cầu đó hoàn toàn sai - theo cú pháp hoặc theo giao thức. Trường hợp cụ thể của bạn thực sự là một lỗi giao thức ứng dụng vì vậy điều này thực sự có thể thích hợp.

10.4.6. 405 Phương pháp không được phép

Phương pháp được chỉ định trong Dòng yêu cầu không được phép đối với tài nguyên được xác định bởi Yêu cầu-URI. Câu trả lời PHẢI bao gồm một tiêu đề Cho phép chứa danh sách các phương thức hợp lệ cho tài nguyên được yêu cầu.

Đây là mã trạng thái tạm thời. Nếu số DELETE đề cập cụ thể đến chính tài nguyên liên hệ (ví dụ: DELETE /contacts/D9DF5176-EEE4-4C70-8DA7-BA57B82027A8) thì đây có thể là mã trạng thái thích hợp nhất. Tuy nhiên, nếu DELETE nằm trên một tài nguyên khác hoặc tài nguyên có truy vấn (ví dụ:, DELETE /contacts?index=12), sau đó tôi sẽ không trả lại một 405. Sau đó, một lần nữa, tôi thường tránh xa bằng cách sử dụng DELETE với bất cứ điều gì giống như một truy vấn.

10.4.10. 409 Xung đột

Yêu cầu không thể hoàn thành do xung đột với trạng thái hiện tại của tài nguyên. Mã này chỉ được cho phép trong các tình huống mà người dùng có thể có khả năng giải quyết xung đột và gửi lại yêu cầu. Cơ quan phản hồi NÊN bao gồm đủ thông tin để người dùng nhận ra nguồn gốc của xung đột. Lý tưởng nhất, thực thể phản hồi sẽ bao gồm đủ thông tin cho người dùng hoặc tác nhân người dùng để khắc phục sự cố; tuy nhiên, điều đó có thể không thực hiện được và không bắt buộc.

Trạng thái này có vẻ thích hợp nhất ở giao diện đầu tiên. Tôi có lẽ sẽ thích 400 trong trường hợp của bạn. 409 sẽ chỉ rõ rằng có xung đột với tài nguyên nhưng thực sự không có gì mà người yêu cầu có thể làm điều đó có thể thay đổi kết quả ngắn thay đổi hoàn toàn tài nguyên (tức là thêm liên hệ trước). Hầu hết các phản hồi 409 là các lỗi đồng thời lạc quan như cố gắng sửa đổi một tài nguyên đã được sửa đổi kể từ khi nó được lấy ra. Ví dụ: xem concurrency failures returned by AtomServer built over Apache Adbera.

Vì vậy, với tất cả điều đó. Tôi có lẽ sẽ sử dụng một cái gì đó như 400 Cannot Delete Last Contact làm dòng phản ứng. Hãy nhớ rằng bạn được phép thay đổi cụm từ được liên kết với mã trạng thái. Đây là một thời gian thực sự tốt để làm một điều như vậy.

+0

Cảm ơn bạn đã nhập D.Shawley, lý do tôi do dự sử dụng 400 là do định nghĩa cụ thể nêu rõ "do cú pháp không đúng định dạng". Dường như bạn đang mở rộng định nghĩa này để bao gồm giao thức ứng dụng. Bạn có bất kỳ tài liệu tham khảo nào hỗ trợ giải thích đó không? –

+0

Bạn cũng nói rằng Phương pháp không được phép là tạm thời. Trong trường hợp của tôi, mỗi liên hệ là tài nguyên của chính nó, vì vậy họ từng có Uri riêng, do đó, bởi đối số của bạn tôi có thể sử dụng mã này. Tuy nhiên, định nghĩa cho mã trạng thái này không thực sự chỉ ra rằng nó là thoáng qua. Tôi trả lại trạng thái này cho các tài nguyên có thể xóa _never_, tức là tài nguyên khách hàng. –

+0

Ok, sau khi thảo luận với một số đồng nghiệp, chúng tôi đã quyết định đi với 405. Tôi đánh dấu đây là câu trả lời đúng vì nó hữu ích trong việc giúp chúng tôi quyết định. Cảm ơn bạn đã giúp đỡ. –

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