2009-04-08 24 views
188

Tôi tự hỏi nếu có một loại enum trong một số thư viện lớp Java chuẩn xác định các hằng số 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 đến/từ các giá trị số nguyên tương ứng.Java có enum hoàn chỉnh cho mã phản hồi HTTP khô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 số mã phản hồi HTTP hợp lệ.

Trả lời

203

Tôi không nghĩ rằng có một đó là hoàn toàn trong các lớp Java chuẩn; HttpURLConnection thiếu một vài mã, như HTTP 100/Continue. Có một danh sách đầy đủ trong Apache Commons, mặc dù: org.apache.commons.HttpClient.HttpStatus.

Cập nhật: Apache Commons HttpClient là end of life. Để biết danh sách mã trạng thái, hãy sử dụng org.apache.http.HttpStatus trong Apache HttpComponents.

+4

Không có một thứ như" danh sách đầy đủ ", vì mã trạng thái có thể và được mở rộng. –

+10

@JulianReschke Tôi nghĩ rằng "hoàn thành" ở đây nên được thực hiện để có nghĩa là "phù hợp với tất cả các mã vạch ra theo tiêu chuẩn". –

+2

John: "tiêu chuẩn" không xác định "tất cả" các mã trạng thái. Đó là lý do tại sao có một đăng ký. –

22

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

+4

thx! điều này làm việc mà không có bất kỳ phụ thuộc bên ngoài nào. 'java.net.HttpURLConnection.HTTP_BAD_REQUEST' – comonad

+0

Câu trả lời trùng lặp – Nathan

42

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

+2

HttpServletResponse hỗ trợ RFC1945 và một phần của 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. –

+2

HttpServletResponse cũng thiếu mã phản hồi 418 được định nghĩa trong [RFC 2324] (https://tools.ietf.org/html/rfc2324) – megaflop

2
+0

Một lần nữa; mã trạng thái có thể mở rộng, do đó không thể có danh sách "hoàn chỉnh", trừ khi nó được sửa đổi mỗi khi mã trạng thái mới được thêm vào đăng ký IANA (http://www.iana.org/assignments/http-status-codes) –

13

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

+1

Tôi muốn thêm rằng Springs org.springframework.http.HttpStatus (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/HttpStatus.html) enum, là chỉ có một tôi có thể tìm thấy cung cấp tài liệu Java với cá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 đang sử dụng Spring thì đây sẽ là thư viện để sử dụng. – lastmannorth

5

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

Ví 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ó để bao gồm toàn bộ API servlet chỉ để nhận các mã này. –

+1

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

+2

Câu trả lời trùng lặp, được đăng sau ba năm? Nên được xoá. – zb226

0

Các nhà cung cấp tốt nhất cho các hằng số mã trạng thái http có khả năng là lớp org.eclipse.jetty.http.HttpStatus Jetty vì:

  • có một gói javadoc trong maven đó là quan trọng nếu bạn tìm kiếm không đổi và chỉ biết số -> chỉ cần mở trang tài liệu api và tìm kiếm số
  • 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 mã số trạng thái ở phía trước mô tả văn bản để làm cho tra cứu tự động hoàn thành dễ thấy hơn khi bạn bắt đầu với mã.

-1

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

+1

Thông tin trùng lặp đã có trong một câu trả lời khác – Nathan

5

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

+0

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

3

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

Trong khi không có nguồn kinh điển cho Status Codes HTTP có một cách đơn giản để thêm bất kỳ hằng Tình trạng thiếu bạn cần phải được cung cấp bởi những javax.ws.rs.core.Response.Status mà không cần thêm bất kỳ phụ thuộc bổ sung cho dự án của bạn.

javax.ws.rs.core.Response.Status chỉ là một triển khai của giao diện javax.ws.rs.core.Response.StatusType. 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 các Mã trạng thái mà bạn muốn.

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

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

Dưới đây là một ý chính với một thực hiện đơn giản với các hằng số được định nghĩa cho "1xx Informational" Status Codes: https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a

1

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

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

Trường hợp httpCode sẽ là mã lý do 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/EnglishReasonPhraseCatalog.html để biết chi tiết

2) Để lấy mã 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

Các vấn đề liên quan