Tôi nên sử dụng mã phản hồi trạng thái HTTP nào nếu yêu cầu thiếu tham số bắt buộc?


Câu trả lời:


388

Tình trạng 422 có vẻ phù hợp nhất dựa trên thông số kỹ thuật .

Mã trạng thái 422 (Thực thể không thể xử lý) có nghĩa là máy chủ hiểu loại nội dung của thực thể yêu cầu (do đó mã trạng thái 415 (Loại phương tiện không được hỗ trợ) là không phù hợp) và cú pháp của thực thể yêu cầu là chính xác (do đó là 400 (Yêu cầu sai ) mã trạng thái không phù hợp) nhưng không thể xử lý các hướng dẫn có trong đó. Ví dụ, điều kiện lỗi này có thể xảy ra nếu một thân yêu cầu XML chứa các hướng dẫn XML được định dạng đúng (nghĩa là đúng về mặt cú pháp), nhưng sai về mặt ngữ nghĩa, về mặt ngữ nghĩa.

Họ tuyên bố rằng xml không đúng định dạng là một ví dụ về cú pháp sai (gọi 400). Một chuỗi truy vấn không đúng định dạng có vẻ tương tự như vậy, vì vậy 400 không phù hợp với chuỗi truy vấn được định dạng tốt mà thiếu tham số.

CẬP NHẬT @DavidV chỉ ra một cách chính xác rằng thông số này dành cho WebDAV, không phải HTTP lõi. Nhưng một số API không phải WebDAV phổ biến dù sao cũng đang sử dụng 422, vì thiếu mã trạng thái tốt hơn ( xem phần này ).


2
IMO Tôi sẽ sử dụng điều này khi giá trị trong chuỗi truy vấn không chính xác, không phải khi có giá trị bổ sung hoặc giá trị bị thiếu. I E. Mong đợi một e-mail và giá trị của nó là '123123'
Derek Litz

2
Tôi có xu hướng nghĩ về một tham số GET và POST là chữ ký phương thức của đường dẫn URL, vì vậy 404 có ý nghĩa với tôi. Trong API RESTful có nghĩa là cho tiêu dùng công cộng, nên trả lại các tham số còn thiếu / thừa. Trong ngữ cảnh của URL, các tham số chuỗi truy vấn thường rất quan trọng để xác định tài nguyên và các tham số thừa hoặc thiếu thể hiện một tài nguyên không tồn tại, không có bất kỳ giả định nào. Tất nhiên, có sự đánh đổi với sự mạnh mẽ bằng cách rõ ràng và các tham số tùy chọn làm cho tài nguyên có khả năng dễ bị lỗi im lặng. Sau đó, có thể sử dụng ...
Derek Litz

13
Thông số kỹ thuật được tham chiếu dành cho WebDAV và không phải là thông số kỹ thuật tiêu chuẩn HTTP.
David V

1
@Kelvin Cảm ơn bạn đã chỉ ra bài viết trên blog. Thật hữu ích khi thấy rằng Twitter, ví dụ, đang sử dụng 422. Tôi nghĩ rằng câu trả lời có thể tốt hơn nếu bạn làm rõ rằng thông số kỹ thuật là WebDAV trong dòng đầu tiên. Khi tôi lần đầu tiên đọc câu trả lời của bạn, tôi nghĩ bạn có nghĩa là thông số kỹ thuật tiêu chuẩn HTTP cho đến khi tôi theo liên kết.
David V

3
Điều này đáng để đọc: bennadel.com/blog/ Đổi Tôi sẽ không sử dụng 422 cho thiếu param. Tôi nghĩ 400là phù hợp hơn.
Zelphir Kaltstahl

184

Tôi không chắc chắn có một tiêu chuẩn được thiết lập, nhưng tôi đã sử dụng 400 Yêu cầu xấu , tài liệu HTTP mới nhất (từ 2014) như sau :

6.5.1. 400 yêu cầu xấu

Mã trạng thái 400 (Yêu cầu xấu) chỉ ra rằng máy chủ không thể hoặc sẽ không xử lý yêu cầu do lỗi được coi là lỗi máy khách (ví dụ: cú pháp yêu cầu không đúng định dạng, đóng khung thông báo yêu cầu không hợp lệ hoặc định tuyến yêu cầu lừa đảo).


65
400 Bad Requestcó nghĩa là để chỉ ra các vấn đề ở cấp độ giao thức, không phải lỗi ngữ nghĩa. Nếu chúng ta sẽ chiếm quyền điều khiển mã trạng thái HTTP để chỉ ra lỗi cấp độ ứng dụng (chứ không phải cấp độ giao thức), tại sao bạn không sử dụng tất cả các cách và chỉ sử dụng 412?
Matt Zukowski

36
Việc triển khai OAuth 1.0 của Google đồng ý với câu trả lời này. Một phản hồi 400 được đưa ra khi các tham số POST bị thiếu hoặc không được hỗ trợ: code.google.com/apis/accounts/docs/OAuth_Vf.html
Tom

1
@ matt-zukowski: "412: Điều kiện tiên quyết được đưa ra trong một hoặc nhiều trường tiêu đề yêu cầu được đánh giá là sai khi thử nghiệm trên máy chủ." từ RFC2616 - Nếu là POST, các tham số nằm trong thân yêu cầu chứ không phải trường tiêu đề yêu cầu. Về mặt kỹ thuật, phương thức GET gửi các tham số của nó trong các tiêu đề yêu cầu nhưng thay vào đó tôi muốn có một số thống nhất?
toong

6
@MattZukowski 400 là mã trạng thái cấp ứng dụng. Nếu bạn nhìn vào cách viết lại trong phiên bản nháp của RFC 7231, bạn sẽ thấy điều đó. Thật không may, từ ngữ trong phiên bản mới nhất không quá rõ ràng vì tác giả của những thay đổi mới nhất cũng đã phát minh ra 422.
Darrel Miller

9
@DarrelMiller là đúng ( liên kết trực tiếp ): "Mã trạng thái 400 (Yêu cầu không hợp lệ) chỉ ra rằng máy chủ không thể hoặc sẽ không xử lý yêu cầu do lỗi được coi là lỗi máy khách (ví dụ: cú pháp yêu cầu không đúng, thông báo yêu cầu không hợp lệ định khung hoặc định tuyến yêu cầu lừa đảo). " Tùy thuộc vào ngữ nghĩa và kỳ vọng mở rộng (một ngày nào đó có thể đưa ra yêu cầu mà không có tham số không?) Thì chỉ có 400 và 404 có vẻ phù hợp trong HTTP tiêu chuẩn. Khác, phát minh ra một mã mới cho API của bạn, nhưng đừng quá tải ngữ nghĩa.
tne

31

Các API WCF trong tay cầm NET thiếu các thông số bằng cách trả lại một HTTP 404lỗi "Endpoint Not Found", khi sử dụng webHttpBinding .

Điều này 404 Not Foundcó thể có ý nghĩa nếu bạn xem xét tên phương thức dịch vụ web của mình cùng với chữ ký tham số của nó. Đó là, nếu bạn đưa ra một phương thức dịch vụ web LoginUser(string, string)và bạn yêu cầu LoginUser(string), thì cái sau không được tìm thấy.

Về cơ bản, điều này có nghĩa là không thể tìm thấy phương thức dịch vụ web mà bạn đang gọi, cùng với chữ ký tham số bạn đã chỉ định.

10.4.5 404 Không tìm thấy

Máy chủ không tìm thấy bất cứ thứ gì khớp với URI yêu cầu. Không có dấu hiệu nào được đưa ra cho dù điều kiện là tạm thời hay vĩnh viễn.

Như 400 Bad Request, Gert gợi ý , vẫn còn là một mã phản hồi có giá trị, nhưng tôi nghĩ rằng nó thường được sử dụng để chỉ ra các vấn đề cấp dưới. Nó có thể dễ dàng được hiểu là một yêu cầu HTTP không đúng định dạng, có thể thiếu các tiêu đề HTTP không hợp lệ hoặc không hợp lệ hoặc tương tự.

10.4.1 400 Yêu cầu xấu

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


Đây là những gì CherryPy làm theo mặc định.
Derek Litz

Còn khi xử lý một yêu cầu bài đăng mà bạn chấp nhận một mô hình và một phần của mô hình bị thiếu thì sao? Trong trường hợp đó, bạn không nhận được 404. Thay vào đó, bạn nhận được một mô hình không hợp lệ nếu tôi không nhầm lẫn và bạn phải quyết định phải làm gì ngay bây giờ.
Shane Courtrille

1
Giải thích này có vẻ như là một sự kéo dài và thể hiện một RPC chứ không phải là một REST POV. URI là mã định danh, và nó tồn tại và đã được tìm thấy. Những gì được gửi trong cơ thể không phải là một phần của định danh tài nguyên. 422 là phù hợp hơn.
Giô-na

404 là câu trả lời đúng, chỉ cần chỉnh sửa một số url trên web để tìm sự đồng thuận!
jenson-button-event

8

Bạn có thể gửi 400 mã Yêu cầu xấu. Đây là một trong những mã trạng thái 4xx có mục đích chung hơn, vì vậy bạn có thể sử dụng nó để hiểu ý bạn: khách hàng đang gửi yêu cầu thiếu thông tin / tham số mà ứng dụng của bạn yêu cầu để xử lý chính xác.


7

Trong một trong các dự án API của chúng tôi, chúng tôi quyết định đặt Trạng thái 409 cho một số yêu cầu, khi chúng tôi không thể điền đầy đủ 100% vì thiếu tham số.

Mã trạng thái HTTP "Xung đột 409" là một thử thách tốt vì định nghĩa của nó đòi hỏi phải bao gồm đủ thông tin để người dùng nhận ra nguồn gốc của xung đột.

Tham khảo: w3.org/Prot Protocol /

Vì vậy, trong số các phản hồi khác như 400 hoặc 404, chúng tôi đã chọn 409 để thực thi nhu cầu xem qua một số ghi chú trong yêu cầu hữu ích để thiết lập một yêu cầu mới và đúng.

Dù trường hợp của chúng tôi là trường hợp cụ thể vì chúng tôi cần gửi một số dữ liệu vào đêm trước nếu yêu cầu không hoàn toàn chính xác và chúng tôi cần buộc khách hàng xem tin nhắn và hiểu những gì sai trong yêu cầu.

Nói chung, nếu chúng ta chỉ có một số tham số bị thiếu, chúng ta sẽ tìm một 400 và một mảng các tham số bị thiếu. Nhưng khi chúng tôi cần gửi thêm một số thông tin, như một thông báo trường hợp cụ thể và chúng tôi muốn chắc chắn hơn rằng khách hàng sẽ chăm sóc nó, chúng tôi sẽ gửi 409


2
Điều này hoàn toàn sai. 409 dành cho các vấn đề tương tranh vì @ MaximeGélinas chỉ ra các tình huống HOẶC tài nguyên đã có sẵn và các bản sao không được phép.
gimlichael

Mỗi thông số kỹ thuật, "Mã trạng thái 409 (Xung đột) chỉ ra rằng yêu cầu không thể hoàn thành do mâu thuẫn với trạng thái hiện tại của tài nguyên đích." . Sử dụng nó cho một tham số bị thiếu là sai; đó là một loại lỗi hoàn toàn khác nhau.
Đánh dấu

5

Tôi thường sử dụng 422 (Thực thể không thể xử lý) nếu có gì đó trong các tham số bắt buộc không khớp với điểm cuối API yêu cầu (như mật khẩu quá ngắn) nhưng đối với tham số bị thiếu, tôi sẽ sử dụng 406 (Không thể chấp nhận).


8
Chà, 406 Không thể chấp nhận được sử dụng với tiêu đề Chấp nhận (nếu máy chủ không thể gửi phản hồi, khách hàng sẽ hiểu). "Tài nguyên được xác định bởi yêu cầu chỉ có khả năng tạo ra các thực thể phản hồi có các đặc điểm nội dung không được chấp nhận theo các tiêu đề chấp nhận được gửi trong yêu cầu." . Tôi bị mắc kẹt với 422 vì không có lựa chọn "đúng" với thông số kỹ thuật hiện tại: - /
JakubKnejzlik

Sử dụng 406 cho điều này là sai. Mã 406 không có nghĩa là yêu cầu không được chấp nhận; điều đó có nghĩa là bạn không thể đáp ứng yêu cầu vì các phản hồi bạn có thể phục vụ là những phản hồi mà khách hàng sẽ không thể chấp nhận được, dựa trên các tiêu đề Chấp nhận mà nó gửi trong yêu cầu. (Ví dụ: yêu cầu được bao gồm Accept-Language: de, cho biết nó sẽ chỉ chấp nhận phản hồi bằng tiếng Đức, nhưng phiên bản duy nhất của tài liệu được yêu cầu mà máy chủ của bạn có sẵn bằng tiếng Anh hoặc tiếng Pháp.) Sử dụng nó để chỉ ra một tham số bị thiếu trong yêu cầu là không chính xác, theo định nghĩa trong spec.
Đánh dấu

3

Đối với những người quan tâm, Spring MVC (ít nhất là 3.x) trả về 400 trong trường hợp này, điều này có vẻ sai đối với tôi.

Tôi đã kiểm tra một số URL của Google (Tài khoản.google.com) và đã xóa các tham số bắt buộc và chúng thường trả về 404 trong trường hợp này.

Tôi sẽ sao chép Google.


18
Bởi vì Google không tự động có nghĩa là Google làm đúng!
RVE

4
Tôi đồng ý, không nhất thiết là "đúng" nhưng đôi khi những gì đúng và những gì hợp lý là hai điều khác nhau. Dù sao đi nữa .. tùy thuộc vào người đọc :)
Neromancer

Một số API Google trả về 400, ví dụ github.com/google/google-api-nodejs-client/issues/404
Dennis

đó là sai (và tại sao mùa xuân mvc không tuân thủ
jax-

3

Có thể lập luận rằng 404 Not Foundnên sử dụng một tài nguyên do không thể tìm thấy tài nguyên được chỉ định.


3
Đây là hành vi mặc định của Java JAX-RS khi tham số truy vấn không thể được chuyển đổi thành kiểu dữ liệu phù hợp. Tôi không đồng ý với nó mặc dù. Tài nguyên WAS được tìm thấy: tham số truy vấn là để lọc tài nguyên và một trong các bộ lọc được cung cấp với giá trị không được chấp nhận. Tôi nghĩ rằng điều này phù hợp với 422 Thực thể không thể xử lý gần nhất và 400 Yêu cầu xấu gần nhất.
Ryan

đó là hành vi mặc định của jax-rs vì đó là hành vi đúng!
jenson-button-event

Sử dụng 404 là hợp lý khi tham số chuỗi truy vấn có nghĩa là xác định tài nguyên, giá trị được đưa ra, nhưng giá trị đó không tương ứng với tài nguyên tồn tại - ví dụ: nếu bạn đang yêu cầu example.com/show-user -profile? user_id = 123 và người dùng 123 không tồn tại. Nhưng đó không phải là những gì câu hỏi này hỏi về; đó là về kịch bản trong đó một tham số bắt buộc bị bỏ qua hoàn toàn. Tôi không thấy làm thế nào tương ứng với một tài nguyên được chỉ định không được tìm thấy.
Đánh dấu

2

Tôi thường sử dụng một lỗi 403 Cấm. Lý do là yêu cầu đã được hiểu, nhưng tôi sẽ không làm như yêu cầu (vì mọi thứ đều sai). Thực thể phản hồi giải thích điều gì sai, vì vậy nếu phản hồi là trang HTML, thông báo lỗi nằm trong trang. Nếu đó là phản hồi JSON hoặc XML, thông tin lỗi sẽ nằm ở đó.

Từ rfc2616 :

10,4,4 403 Cấm

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ế.


4
Âm thanh ban đầu tốt, mặc dù tôi tự nhiên liên kết điều này với các lỗi dựa trên xác thực hoặc quyền. Ngoài ra, thông số kỹ thuật gợi ý về điều này trong đó có ghi "nếu máy chủ không muốn cung cấp thông tin này cho khách hàng". Ngoài ra, 404 có thể là một lựa chọn tốt hơn. Tôi sẽ hướng tới 404 hoặc 400 hơn 403.
tonyhb

21
Đây là một ý tưởng khủng khiếp, ngay cả khi âm thanh kỹ thuật. 403 được sử dụng phổ biến cho các phản hồi lỗi auth và bạn sẽ nhầm lẫn giữa các khách hàng của mình nếu bạn cố gắng sử dụng điều này để chỉ ra các lỗi tham số. Ví dụ, Twitter thực hiện điều này - 403 được sử dụng cả khi bạn cung cấp thông tin xác thực OAuth không hợp lệ và khi có yêu cầu sai về mặt ngữ nghĩa với yêu cầu của bạn - và đó là một sự nhầm lẫn liên tục cho các máy khách API.
Matt Zukowski

1
@MattZukowski cũng vậy thôi. Thông số kỹ thuật nói Authorization will not help, vì vậy Twitter không nên gửi thông tin này cho thông tin xác thực OAuth không hợp lệ.
torvin

@torvin Twitter nên gửi một 401 Unauthorizedthay thế. Tuy nhiên, bạn có thể hiểu lý do tại sao họ không xem nếu bạn xem các mô tả của tài liệu MDN về hai mã này, rất giống nhau.
Búa búa Agi

-1

Chỉ cần sử dụng ASP.NET Core làm tài liệu tham khảo hoặc ví dụ, ASP.NET Core cho phép bạn tạo ra một bộ điều khiển bằng các hành động, đây là cách hành động "Chi tiết" trông như thế nào.

    // GET: Cars/Details/5
    public async Task<IActionResult> Details(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var car = await _context.Cars.FirstOrDefaultAsync(m => m.CarId == id);
        if (car == null)
        {
            return NotFound();
        }

        return View(car);
    }

Nếu tham số idkhông được đặt, thì nó trả về 404 Không tìm thấy.


-5

Trả lại 404 - có nghĩa là không thể tìm thấy tài nguyên.

Hãy thử chỉnh sửa một url của một trang web có chứa một id. Tôi đã thử một vài:

  • vấn đề repo gitub
  • trang hợp lưu
  • xem sản phẩm của amazon
  • danh sách ebay
  • bài viết tin tức bbc

Tất cả trả về 404, imo vì các nhà phát triển đó đang giải thích chính xác tiêu chuẩn, mà câu trả lời ở đây và nhiều người khác, không phải vậy!


1
Tôi tin rằng hầu hết các nhà phát triển định nghĩa "tham số" là một trong các cặp tên / giá trị trong chuỗi truy vấn hoặc dạng thân bài POST. Một yêu cầu vấn đề repo Github không chứa điều này.
Kelvin

@Kelvin chúng tôi devs cũng bao gồm các tham số đường dẫn trong danh sách. nếu BẤT K url tham số url nào là bắt buộc, thể hiện vị trí của tài nguyên và không được bao gồm, thì phải trả về 404. Đây không bao gồm các requestBody.
jenson-button-event

-6

Tôi sẽ đi với một 403.

Từ RFC 2616 - Giao thức truyền siêu văn bản - HTTP / 1.1

403 Cấm

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ế.

Bạn nên mô tả lý do thất bại trong phản ứng của bạn. Nếu bạn không muốn làm điều đó, chỉ cần sử dụng 404.


3
downvote vì đây là một câu trả lời trùng lặp. Xem xét thêm câu mới nhất của bạn dưới dạng nhận xét vào câu trả lời cũ hơn để sử dụng 403
người dùng
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.