2012-02-26 5 views
46

Tôi có một số trang được thiết kế để được gọi với AJAX - Tôi có chúng trả lại mã trạng thái bất thường nếu chúng không thể được hiển thị và javascript của tôi sẽ hiển thị một hộp lỗi tương ứng.Mã trạng thái HTTP nào để sử dụng cho các thông số bắt buộc không được cung cấp?

Ví dụ: nếu người dùng không được xác thực hoặc phiên của họ đã hết thời gian và họ cố gắng gọi một trong các trang AJAX, nó sẽ trả lại 401 Unathorized.

Tôi cũng có một số trả lại 500 Internal Server Error nếu có điều gì đó thực sự kỳ lạ xảy ra phía máy chủ.

Tôi nên trả lại mã trạng thái nào nếu một trong các trang này được gọi mà không có thông số bắt buộc? (và do đó không thể trả lại bất kỳ nội dung nào).

tôi đã có một cái nhìn tại các wikipedia article on HTTP status codes, nhưng gần nhất mà tôi có thể tìm đến đoạn code tôi đang tìm là thế này:

422 Unprocessable Entity
The request was well-formed but was unable to be followed due to semantic errors.

Edit: Đoạn mã trên là WebDAV cụ thể và do đó khó có thể thích hợp trong trường hợp này

Có ai nghĩ đến mã thích hợp để trả lại không?

+1

Xem cũng (nếu đó không phải là một bản sao chẵn): [mã trạng thái HTTP cho dữ liệu xấu] (http://stackoverflow.com/questions/1364527/http-status-code-for- dữ liệu xấu) – hakre

+1

422 hoàn toàn phù hợp. –

+0

@JulianReschke Tôi nghĩ rằng 4918 có thể làm với một số errata, trước hết phải xác định rằng nó cập nhật 2616, và thứ hai để làm rõ rằng các mã trạng thái HTTP mới không phải là tất cả các WebDAV cụ thể. – Alnitak

Trả lời

32

What status code should I return if one of these pages was called without required parameters? (and therefore can't return any content).

Bạn có thể chọn 404 Not Found:

The server has not found anything matching the Request-URI [assuming your required parameters are part of the URI, i.e. $_GET ]. No indication is given of whether the condition is temporary or permanent. The 410 (Gone) status code SHOULD be used if the server knows, through some internally configurable mechanism, that an old resource is permanently unavailable and has no forwarding address. This status code is commonly used when the server does not wish to reveal exactly why the request has been refused, or when no other response is applicable.

(điểm nhấn của tôi)

404 Not Found là một tập hợp con của 400 Bad Request có thể được thực hiện như là tốt vì nó rất rõ ràng về điều này là:

The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.

Tôi thực sự không thể đề xuất bạn chụp ảnh Mã phản hồi ka WEBDAV không tồn tại cho các máy khách HTTP sử dụng siêu văn bản, nhưng bạn có thể, nó hoàn toàn hợp lệ, bạn là người lập trình máy chủ, bạn có thể thực sự lấy bất kỳ mã trạng thái phản hồi HTTP nào mà bạn thấy phù hợp với ứng dụng khách HTTP của mình. nhà thiết kế:

11.2. 422 Unprocessable Entity

The 422 (Unprocessable Entity) status code means the server understands the content type of the request entity (hence a 415(Unsupported Media Type) status code is inappropriate), and the syntax of the request entity is correct (thus a 400 (Bad Request) status code is inappropriate) but was unable to process the contained instructions. For example, this error condition may occur if an XML request body contains well-formed (i.e., syntactically correct), but semantically erroneous, XML instructions.

Thực thể yêu cầu IIRC là cơ quan yêu cầu. Vì vậy, nếu bạn đang hoạt động với các cơ quan yêu cầu, nó có thể thích hợp như Julian đã viết.


Bạn nhận xét:

IMHO, the text for 400 speaks of malformed syntax. I would assume the syntax here relates to the syntax of HTTP string that the client sends across to the server.

Đó có thể, nhưng nó có thể là bất cứ điều gì cú pháp đã bày tỏ, toàn bộ yêu cầu, chỉ có một số tiêu đề yêu cầu, hoặc một tiêu đề yêu cầu cụ thể, yêu cầu URI vv .. 400 không phải là đặc biệt về "chuỗi cú pháp HTTP", đó là infact câu trả lời chung một lỗi khách hàng:

The 4xx class of status code is intended for cases in which the client seems to have erred. Except when responding to a HEAD request, the server SHOULD include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition. These status codes are applicable to any request method. User agents SHOULD display any included entity to the user.

phần quan trọng là ở đây mà bạn phải nói với khách hàng những gì đã xảy ra. Mã trạng thái chỉ nói rằng đã xảy ra sự cố (trong lớp 4xx), nhưng HTTP chưa được thiết kế đặc biệt để làm cho tham số phần thông tin truy vấn bị thiếu đáng chú ý là điều kiện lỗi.Thực tế, URI chỉ biết rằng có một phần truy vấn-thông tin chứ không phải ý nghĩa của nó.

Nếu bạn cho rằng 400 quá rộng, tôi khuyên bạn nên chọn 404 nếu sự cố có liên quan đến URI, ví dụ: $_GET biến.

+0

IMHO, văn bản cho 400 nói cú pháp * sai *. Tôi cho rằng cú pháp ở đây liên quan đến cú pháp của chuỗi HTTP mà máy khách gửi đến máy chủ. Trong trường hợp thiếu tham số, cú pháp sẽ vẫn chính xác, điều đó khiến tôi tin rằng 400 là một lựa chọn tồi. Sửa chữa cho tôi nếu tôi sai ở bất cứ nơi nào :) – SuperSaiyan

+0

@Thrustmaster: Bạn không sai, nhưng hơi hẹp đầu óc. Chỉ vì nó có thể là vậy, không có nghĩa là nó không thể có nghĩa là người kia. Đặc biệt đối với các mã x00 đúng. Đã thêm một số thông tin khác. – hakre

+0

Tôi có thể hơi hẹp suy nghĩ, hehe. Tôi vẫn chưa tin. Tôi đoán tôi sẽ đọc RFC hoàn toàn trước khi tôi bình luận thêm nữa. Cảm ơn câu trả lời, upvoted :) – SuperSaiyan

8

Tôi không biết về ý định của nhà văn RFC, nhưng mã trạng thái tôi đã thấy được sử dụng trong trường hợp đó là 400 Yêu cầu không hợp lệ.

+0

400 là, IMO, một lựa chọn tồi. Kiểm tra bình luận của tôi bên dưới câu trả lời của hakre. Làm cho tôi biết nếu tôi sai trong bất kỳ cách nào :) – SuperSaiyan

+3

Bạn chỉ sai khi không đưa ra đề xuất tốt hơn. :) – AndreKR

+0

Tôi đã làm (có thể không có trong nhận xét), 404 :) – SuperSaiyan

0

đã đọc kỹ phần này:

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

422 là một điều WebDAV cụ thể, và tôi đã không nhìn thấy nó được sử dụng cho bất cứ điều gì khác.

400, mặc dù không dành cho mục đích cụ thể này, dường như là một lựa chọn phổ biến.

404 cũng là một lựa chọn khả thi nếu API của bạn là RESTful hoặc tương đương (bằng cách sử dụng một phần đường dẫn của URI để chỉ ra các thông số tìm kiếm)

+0

cảm ơn - hiện đã cập nhật câu hỏi –

+2

422 là * không * WebDAV cụ thể và * được * sử dụng trong các ngữ cảnh khác. –

1

Mô tả như trích dẫn chống lại 400

The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.

(tôi nhấn mạnh)

Điều đó nói về cú pháp không đúng định dạng, điều này không xảy ra khi trình duyệt gửi yêu cầu đến máy chủ. Nó chỉ là trường hợp thiếu tham số (trong khi không có cú pháp không đúng định dạng).

tôi sẽ đề nghị thanh với 404 :)

(Các chuyên gia chính xác cho tôi nếu tôi sai bất cứ nơi nào :))

+3

Xem http://trac.tools.ietf.org/wg/httpbis/trac/ticket/303; việc sửa đổi RFC 2616 sẽ làm rõ rằng "Cú pháp không đúng định dạng" chỉ là một trong nhiều lý do tiềm năng. –

6

422 là một mã trạng thái HTTP thông thường; và được sử dụng bên ngoài WebDAV. Trái với những gì người khác nói, không có vấn đề gì với điều đó; HTTP có đăng ký mã trạng thái vì lý do.

Xem http://www.iana.org/assignments/http-status-codes

+0

Chắc chắn bạn cũng có thể sử dụng 478, đó là lựa chọn của bạn, bạn không bị ràng buộc với bất kỳ RFC nào. Tuy nhiên tôi sẽ không đề xuất sử dụng lại mã cụ thể của WEBDAV cho câu hỏi này. Và về mặt kỹ thuật, bạn cũng không cần phải dựa vào IANA, miễn là nó là một cái gì đó 4xx nó rõ ràng cho bất kỳ useragent HTTP, xem các thông số kỹ thuật HTTP. Nó chỉ là một câu hỏi mà bạn muốn. – hakre

+1

Vâng, 422 là một mã trong đăng ký mã trạng thái IANA, được định nghĩa trong một IFC theo tiêu chuẩn theo dõi RFC. 478 thì không. –

+1

Vì vậy, những gì? Nó sẽ mất nhiều năm cho đến khi 478 sẽ được sử dụng và khi đó là trường hợp và bạn đã thiết lập commons xung quanh nó, IETF sẽ phản ánh nó. Đặc biệt nếu khách hàng là khách hàng AJAX được kiểm soát của riêng bạn, không có gì nhiều để quan tâm bên ngoài miền của bạn. Nó thậm chí có thể khôn ngoan hơn để sử dụng một mã trạng thái không sử dụng hơn là tái sử dụng một cái gì đó trong đó IANA đã nói rằng nó được sử dụng cho một mục đích cụ thể, một kết nối WEBDAV. – hakre