Mã trạng thái HTTP cho một yêu cầu thành công một phần


115

Tôi có một ứng dụng gửi tin nhắn cho người dùng. Trong một yêu cầu bài đăng, một chuỗi XML được chuyển bao gồm tất cả những người dùng sẽ nhận được thông báo cụ thể đó. Nếu bất kỳ người dùng nào trong danh sách không tồn tại, tôi sẽ cung cấp lại danh sách người dùng bị thiếu cho khách hàng để đánh giá thêm.

Bây giờ tôi đang tự hỏi mình mã trạng thái thích hợp cho ứng dụng nói rằng yêu cầu đã được chấp nhận nhưng có những điều không thể thực hiện được.

Vấn đề sẽ tránh được nếu nó không được phép đưa những người dùng bị thiếu vào danh sách. Sau đó, nỗ lực gửi sẽ chỉ gặp lỗi 4xx. Nhưng chẳng ích gì khi hình thành API theo cách này. Mặt khác, tôi có thể coi điều kiện lỗi hoàn toàn là ứng dụng cụ thể. Nhưng gửi 200 không cảm thấy đúng. Và sẽ rất tuyệt nếu cung cấp cho khách hàng một gợi ý khi nào nên xem xét kỹ phản hồi lỗi. ví dụ: để tránh gửi tin nhắn cho người dùng đó nhiều lần

Câu trả lời:


66

Tôi đã giải quyết một vấn đề tương tự. Trong trường hợp này, tôi đã trả lại một

207 Đa trạng thái

Bây giờ, đây không phải là HTTP nghiêm ngặt, nó là một phần của tiện ích mở rộng WebDAV, vì vậy nếu bạn cũng không có quyền kiểm soát ứng dụng khách, thì điều này không tốt cho bạn. Nếu bạn làm vậy, bạn có thể làm điều gì đó như sau:

   <?xml version="1.0" encoding="utf-8" ?>
   <D:multistatus xmlns:D='DAV:'>
     <D:response>
       <D:user>user-123</D:user>
       <D:status>success</D:status>
     </D:response>
     <D:response>
       <D:user>user-789</D:user>
       <D:status>failure</D:status>
     </D:response>
   </D:multistatus>

Nhưng một lần nữa, đây là một phần mở rộng HTTP và bạn cũng cần có quyền kiểm soát ứng dụng khách.


3
Tôi đã nghĩ về việc sử dụng cái này nhưng tôi không hoàn toàn thoải mái với nó. Cảm ơn!
Norbert Hartl

Điều thú vị về nó là bạn có thể trả về nhiều hoặc ít dữ liệu thích hợp tùy thích - điều này đặc biệt hữu ích cho các tập dữ liệu hỗn hợp, tức là: một số không thành công và một số vượt qua.
Kylar

Tôi hiểu. Tôi chỉ đang cố gắng tránh một mức độ xử lý trạng thái bổ sung (không tốt cho IMHO). Hầu hết mã của tôi hoạt động với HTTP. Và tôi nghĩ rằng trường hợp sử dụng được mô tả của tôi sẽ hoạt động tốt mà không cần.
Norbert Hartl

Bạn luôn có thể gửi lại nội dung - gửi 200 với phản hồi JSON hoặc bất kỳ thứ gì bạn muốn trong đó để xác định những phản hồi nào đã thành công.
Kylar

Vâng tôi biết. Nhưng nếu bạn trả về một phần thân, bạn cần phải phân tích cú pháp nó. Và ngay lúc đó bạn giới thiệu lớp xử lý logic ứng dụng thứ hai. Điều này làm tăng sự phức tạp và bạn cần có lý do chính đáng để làm điều đó.
Norbert Hartl

65

Tôi đã gặp vấn đề tương tự và cuối cùng tôi đã sử dụng hai giải pháp khác nhau:

  • Mã trả về HTTP 202: Accepted, cho biết rằng yêu cầu đã ổn, nhưng không có gì đảm bảo rằng mọi thứ thực sự diễn ra như bình thường.
  • Trả lại bình thường 200trong phản hồi, nhưng bao gồm danh sách những gì không xuất hiện trong nội dung phản hồi.

Cái thứ hai thường hoạt động tốt nhất, nhưng cái đầu tiên là tuyệt vời nếu bạn lười biếng hoặc sử dụng hàng đợi để xử lý.


5
Không phải 202 đề cập nhiều hơn đến một cái gì đó như xếp hàng?
Sinaesthetic

6
Vâng, @Sinaesthetic. Từ thông số kỹ thuật HTTP 1.1 gần đây nhất, "(...) yêu cầu đã được chấp nhận để xử lý, nhưng quá trình xử lý vẫn chưa hoàn tất". Vì vậy, đối với thành công một phần, 202 là không thích hợp.
Huercio

-4

Còn về việc sử dụng 206 Nội dung một phần. Tôi biết 206 là nhiều hơn về phạm vi, nhưng điều gì sẽ xảy ra nếu nó có thể chỉ ra một yêu cầu thành công một phần?


MDN tuyên bố như sau: "Mã phản hồi trạng thái thành công Nội dung Phần HTTP 206 cho biết rằng yêu cầu đã thành công và có phần thân chứa các dải dữ liệu được yêu cầu, như được mô tả trong tiêu đề Phạm vi của yêu cầu." Theo như tôi hiểu, 206 Nội dung một phần hoàn toàn dành cho các yêu cầu có phạm vi nội dung.
sbbs

-14

Giao thức truyền siêu văn bản giải quyết khía cạnh truyền tải của mọi thứ. Nó không có mã lỗi để đối phó với các lỗi cấp ứng dụng.

Trả lại 200 là điều đúng đắn cần làm ở đây. Theo như HTTP có liên quan, yêu cầu đã được nhận đúng cách, được xử lý đúng cách và bạn đang gửi phản hồi trở lại. Vì vậy, ở cấp độ HTTP, mọi thứ đều ổn. Bất kỳ lỗi hoặc cảnh báo nào liên quan đến ứng dụng chạy trên http phải nằm trong phản hồi. Làm như vậy cũng sẽ ngăn chặn một số vấn đề khó chịu mà bạn có thể gặp phải với các máy chủ proxy có thể không xử lý các phản hồi nhất định theo cách bạn mong đợi.


18
HTTP là một giao thức cấp ứng dụng. Bạn không thể đặt nó đơn giản ở mức độ vận chuyển và ứng dụng. Nếu bạn nghĩ về OSI thì HTTP ở lớp 5-7. HTTP hơi khác. Hầu hết các tiêu đề và mã trả lại thực sự là ứng dụng cụ thể. Các mã chỉ phụ thuộc vào thông tin được cung cấp trong các thực thể giao thức HTTP chứ không phụ thuộc vào những thứ định dạng ứng dụng tùy chỉnh. Về 200, tôi sẽ nói rằng định nghĩa của bạn hoàn toàn sai nếu nó được áp dụng cho các động từ không phải là POST. Nhưng POST thay đổi các trò chơi một chút và trong bối cảnh này giả định của bạn "xử lý đúng cách" không phải là chắc chắn, một trong hai
Norbert Hartl

Nói một cách chính xác thì OSI coi HTTP là một giao thức cấp ứng dụng và khi nói chuyện với một máy chủ web 'bình thường' thì điều này đúng. Nhưng trong trường hợp của bạn, bạn đang chạy giao thức của riêng mình trên HTTP, giống như nhiều ứng dụng hiện nay. Trong kiểu sử dụng đó, HTTP chỉ cung cấp truyền tải. (Ứng dụng của bạn đang gửi tin nhắn cho người dùng chứ không phải truyền siêu văn bản ...)
AVee 12/12/11

2
Chỉ để được rõ ràng. HTTP theo cách REST là trọng tâm tài nguyên. Trong ngữ cảnh này, 200 có nghĩa là danh tính (tài nguyên bạn đã chỉ định) thay vì 3xx chỉ theo hướng của danh tính. Việc sử dụng POST biến URI tài nguyên thành URI xử lý và có các mã lỗi cần phải xử lý. Bối cảnh thay đổi một chút và defintion của những thứ có được một chút mờ hoặc ít nhất là khó hiểu
Norbert Hartl

1
Việc thay đổi ngữ cảnh cũng có nghĩa là không có mã lỗi phù hợp, vì giao thức không bao giờ được thiết kế với ngữ cảnh đó ;-) Tôi cũng nghĩ bạn nên cẩn thận với việc sử dụng mã lỗi vì máy chủ proxy có xu hướng chạy với chúng thay thế phản hồi của bạn bằng trang lỗi tùy chỉnh, đây có thể là một PITA thực.
AVee

1
Dù sao, cảm ơn vì đã trả lời câu hỏi của tôi. Stackoverflow tôi chỉ phát hiện ra là xấu chat client :)
Norbert Hartl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.