Có thể muộn trò chơi nhưng tôi đã vấp phải vấn đề ngữ nghĩa này trong khi cố gắng tạo API REST.
Để mở rộng một chút về câu trả lời của Wrikken, tôi nghĩ bạn có thể sử dụng 409 Conflict
hoặc 403 Forbidden
tùy thuộc vào tình huống - tóm lại, sử dụng lỗi 403 khi người dùng hoàn toàn không thể làm gì để giải quyết xung đột và hoàn thành yêu cầu (ví dụ: họ không thể gửi DELETE
yêu cầu xóa tài nguyên một cách rõ ràng) hoặc sử dụng 409 nếu có thể có thể thực hiện được.
Máy chủ hiểu yêu cầu, nhưng từ chối thực hiện nó. Ủy quyền sẽ không giúp đỡ và yêu cầu KHÔNG NÊN lặp lại. Nếu phương thức yêu cầu không phải là CHÍNH và máy chủ muốn công khai lý do tại sao yêu cầu chưa được thực hiện, thì NÊN mô tả lý do từ chối trong thực thể. Nếu máy chủ không muốn cung cấp thông tin này cho khách hàng, mã trạng thái 404 (Không tìm thấy) có thể được sử dụng thay thế.
Ngày nay, có người nói "403" và vấn đề về quyền hoặc xác thực xuất hiện, nhưng thông số kỹ thuật nói rằng về cơ bản, máy chủ nói với khách hàng rằng họ sẽ không làm điều đó, đừng hỏi lại và đây là lý do khách hàng không nên hỏi lại 't.
Vì PUT
so với POST
... POST
nên được sử dụng để tạo một phiên bản mới của tài nguyên khi người dùng không có phương tiện hoặc không nên tạo định danh cho tài nguyên. PUT
được sử dụng khi danh tính của tài nguyên được biết đến.
...
Sự khác biệt cơ bản giữa các yêu cầu POST và PUT được phản ánh theo nghĩa khác nhau của URI yêu cầu. URI trong yêu cầu POST xác định tài nguyên sẽ xử lý thực thể kèm theo. Tài nguyên đó có thể là một quá trình chấp nhận dữ liệu, một cổng vào một số giao thức khác hoặc một thực thể riêng biệt chấp nhận các chú thích. Ngược lại, URI trong yêu cầu PUT xác định thực thể kèm theo yêu cầu - tác nhân người dùng biết URI được dự định là gì và máy chủ KHÔNG cố gắng áp dụng yêu cầu cho một số tài nguyên khác. Nếu máy chủ mong muốn rằng yêu cầu được áp dụng cho một URI khác,
nó PHẢI gửi phản hồi 301 (Đã di chuyển vĩnh viễn); tác nhân người dùng CÓ THỂ đưa ra quyết định của riêng mình về việc có chuyển hướng yêu cầu hay không.