Java có enum hoàn chỉnh cho mã phản hồi HTTP không?


267

Tôi tự hỏi nếu có một loại enum trong một số thư viện lớp Java tiêu chuẩn xác định các hằng biểu tượng cho tất cả các mã phản hồi HTTP hợp lệ. Nó sẽ hỗ trợ chuyển đổi sang / từ các giá trị nguyên tương ứng.

Tôi đang gỡ lỗi một số mã Java sử dụng javax.ws.rs.core.Response.Status. Nó hoạt động, nhưng nó chỉ xác định khoảng một nửa mã phản hồi HTTP hợp lệ.

Câu trả lời:


280

Tôi không nghĩ có cái nào hoàn chỉnh trong các lớp Java tiêu chuẩn; HttpURLConnectionthiếu một vài mã, như thế HTTP 100/Continue.

Mặc dù vậy, có một danh sách đầy đủ trong các HTTPComponents của Apache:
org.apache.http.HttpStatus(được thay thế org.apache.commons.HttpClient.HttpStatustừ Apache HTTP Client, đã hết tuổi thọ )


5
Không có thứ gọi là "danh sách đầy đủ", vì mã trạng thái có thể được và được gia hạn.
Julian Reschke

16
@JulianReschke Tôi nghĩ rằng "hoàn thành" ở đây nên được hiểu là "phù hợp với tất cả các mã được nêu trong tiêu chuẩn".
John Women'sella

2
John: "tiêu chuẩn" không định nghĩa "tất cả" các mã trạng thái. Đó là lý do tại sao có một sổ đăng ký.
Julian Reschke

1
iana.org/assignments/http-status-codes/http-status-codes.xml có một danh sách lớn bao gồm mã = ​​100
Garis M Suero

1
@Donal: một lần nữa, không phải là một danh sách tốt. Những gì có liên quan là đăng ký IANA.
Julian Reschke

66

Giao diện javax.servlet.http.HttpServletResponsetừ API servlet có tất cả các mã phản hồi dưới dạng inttên hằng SC_<description>. Xem http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html


3
HttpServletResponse hỗ trợ RFC1945 và một phần của các tiêu chuẩn RFC2616, nhưng nó thiếu tất cả RFC2518. Nếu bạn cần một danh sách đầy đủ, hãy xem HttpStatus như tôi đã đề cập.
John Femaleella

2
HttpServletResponse cũng thiếu mã phản hồi 418 được xác định trong RFC 2324
daiscog

Sử dụng HttpServletResponse trong bất kỳ thứ gì chạy bên ngoài một servlet có thể dẫn đến các vấn đề phụ thuộc kim cương do các lớp chồng chéo trong các tạo phẩm của servlet khác nhau.
Elliotte Rusty Harold

51

Chà, có các hằng số tĩnh của các giá trị nguyên chính xác trong lớp httpURLConnection


6
cám ơn! Điều này hoạt động mà không có bất kỳ phụ thuộc bên ngoài. java.net.HttpURLConnection.HTTP_BAD_REQUEST
comonad

Thật tốt khi đó là một phần của thư viện tiêu chuẩn, nhưng thật không may, nó không đầy đủ - trong phạm vi 400, ví dụ như nó bị cắt ở mức 415.
tschumann

18

Nếu bạn đang sử dụng Spring, bản phát hành 3.x có thứ bạn đang tìm kiếm: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html


3
Tôi muốn thêm rằng Springs org.springframework.http.HttpStatus ( docs.spring.io/spring/docs/cien/javadoc-api/org/iêu ) enum, là người duy nhất tôi có thể tìm thấy cung cấp tài liệu Java có liên kết đến danh sách đầy đủ các mã trạng thái và cách sử dụng chúng trong mỗi enum. Nếu bạn đã sử dụng Spring thì đây sẽ là thư viện để sử dụng.
Lastmannorth

2
Nó có 100 và 418. Đáng tiếc là bạn phải gọi HttpStatus.XXX.value()để lấy int.
WesternGun

7

Nếu bạn đang sử dụng Netty , bạn có thể sử dụng:


thật không may, đây không phải là enum und do đó không thể sử dụng được trong các báo cáo trường hợp (khiến tôi buồn)
Frederick Roth

7

Mọi người dường như đang bỏ qua phần "loại enum" trong câu hỏi của bạn.

Mặc dù không có nguồn chính tắc nào cho Mã trạng thái HTTP, có một cách đơn giản để thêm bất kỳ hằng số Trạng thái bị thiếu nào bạn cần vào javax.ws.rs.core.Response.Statusmà không cần thêm bất kỳ phụ thuộc bổ sung nào vào dự án của bạn.

javax.ws.rs.core.Response.Statuschỉ là một thực hiện của javax.ws.rs.core.Response.StatusTypegiao diện. Bạn chỉ cần tạo enum triển khai của riêng bạn với các định nghĩa cho Mã trạng thái mà bạn muốn.

Các thư viện cốt lõi như Javax, Jersey, v.v. được ghi vào giao diện StatusType chứ không phải triển khai Status (hoặc chắc chắn chúng phải như vậy). Vì Status enum mới của bạn thực hiện StatusTypenên nó có thể được sử dụng bất cứ nơi nào bạn sẽ sử dụng javax.ws.rs.core.Response.Statushằng.

Chỉ cần nhớ rằng mã của riêng bạn cũng nên được ghi vào StatusTypegiao diện. Điều này sẽ cho phép bạn sử dụng cả Mã trạng thái của riêng mình cùng với mã "tiêu chuẩn".

Đây là một ý chính với cách triển khai đơn giản với các hằng số được xác định cho Mã trạng thái "Thông tin 1xx": https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a


5

Sử dụng lớp javax.servlet.http.HttpServletResponse

Thí dụ:

javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED //401
javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR //500

4
để phát triển ứng dụng khách, thật khó khăn khi bao gồm toàn bộ API của servlet chỉ để nhận các mã này.
Jeffrey Blattman

1
Nó có thể là gánh nặng đối với một số trường hợp nhưng tôi đã tìm thấy câu trả lời hay này và tôi đang viết một ứng dụng web dựa trên servlet để nó tốt cho tôi.
Andrei Rînea

2
Một câu trả lời trùng lặp, được đăng hơn ba năm sau? Nên được xoá.
zb226

4

1) Để lấy văn bản lý do nếu bạn chỉ có mã, bạn có thể sử dụng:

org.apache.http.impl.EnglishReasonPhraseCatalog.INSTANCE.getReason(httpCode,null)

Đâu httpCodesẽ là mã lý do mà bạn nhận được từ phản hồi HTTP.

Xem https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishR LýPhPhương pháp.html để biết chi tiết

2) Để lấy lý do nếu bạn chỉ có văn bản, bạn có thể sử dụng BasicHttpResponse.

Xem tại đây để biết chi tiết: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html



0

Nhà cung cấp tốt nhất cho các hằng số mã trạng thái http có thể là lớp org.eclipse.jetty.http.HttpStatus của Jetty vì:

  • có một gói javadoc trong maven rất quan trọng nếu bạn tìm kiếm hằng số và chỉ biết số -> chỉ cần mở trang tài liệu api và tìm kiếm số
  • các hằng số chứa chính mã số trạng thái.

Điều duy nhất tôi sẽ cải thiện: đặt số mã trạng thái trước mô tả văn bản để làm cho việc tra cứu hoàn thành tự động trở nên thuận tiện hơn khi bạn bắt đầu với mã.


-1

Một tùy chọn khác là sử dụng HttpStatuslớp từ commons-httpclient của Apache, cung cấp cho bạn các trạng thái http khác nhau dưới dạng hằng số.

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.