Czy Java ma pełne wyliczanie kodów odpowiedzi HTTP?


267

Zastanawiam się, czy w standardowej bibliotece klas Java jest typ wyliczania, który definiuje stałe symboliczne dla wszystkich prawidłowych kodów odpowiedzi HTTP. Powinien obsługiwać konwersję do / z odpowiednich wartości całkowitych.

Debuguję kod Java, który używa javax.ws.rs.core.Response.Status. Działa, ale określa tylko około połowy prawidłowych kodów odpowiedzi HTTP.

Odpowiedzi:


280

Nie wydaje mi się, żeby taki był kompletny w standardowych klasach Java; HttpURLConnectionbrakuje sporo kodów, takich jak HTTP 100/Continue.

Istnieje jednak pełna lista w Apache HttpComponents:
org.apache.http.HttpStatus(zastąpiona org.apache.commons.HttpClient.HttpStatusz klienta Apache Http, który osiągnął koniec życia )


5
Nie ma czegoś takiego jak „pełna lista”, ponieważ kody stanu mogą być i są rozszerzane.
Julian Reschke

16
@JulianReschke Myślę, że „kompletny” należy tutaj rozumieć jako „zgodny ze wszystkimi kodami określonymi przez standard”.
John Feminella,

2
John: „standard” nie definiuje „wszystkich” kodów stanu. Dlatego istnieje rejestr.
Julian Reschke


1
@Donal: znowu, niezbyt dobra lista. Istotny jest rejestr IANA.
Julian Reschke,

66

Interfejs javax.servlet.http.HttpServletResponseAPI serwletu zawiera wszystkie kody odpowiedzi w postaci intnazw stałych SC_<description>. Zobacz http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html


3
HttpServletResponse obsługuje RFC1945 i część standardów RFC2616, ale brakuje całej RFC2518. Jeśli potrzebujesz pełnej listy, zobacz HttpStatus, jak wspomniałem.
John Feminella,

2
W HttpServletResponse brakuje również kodu odpowiedzi 418 zdefiniowanego w RFC 2324
daiscog

Użycie HttpServletResponse we wszystkim, co działa poza serwletem, może prowadzić do problemów związanych z zależnością diamentów z powodu nakładających się klas w różnych artefaktach serwletu.
Elliotte Rusty Harold

51

Cóż, istnieją stałe statyczne dokładnych wartości liczb całkowitych w klasie HttpURLConnection


6
dzięki! działa to bez żadnych zewnętrznych zależności. java.net.HttpURLConnection.HTTP_BAD_REQUEST
comonad

Dobrze, że jest częścią standardowej biblioteki, ale niestety jest niekompletna - na przykład w zakresie 400 odcina się o 415.
tschumann

18

3
Chciałbym dodać, że enum Springs org.springframework.http.HttpStatus ( docs.spring.io/spring/docs/current/javadoc-api/org/… ) jest jedynym, który udało mi się znaleźć, który zapewnia dokumentację Java z linkami do pełnej listy kodów statusu i ich użycia w każdym wyliczeniu. Jeśli korzystasz już z Spring, będzie to biblioteka do użycia.
lastmannorth

2
Ma 100 i 418. Szkoda, że ​​musisz zadzwonić, HttpStatus.XXX.value()aby dostać int.
WesternGun


7

Wygląda na to, że wszyscy ignorują część twojego typu „enum”.

Chociaż nie ma kanonicznego źródła dla kodów stanu HTTP, istnieje prosty sposób dodania wszelkich brakujących stałych statusu, których potrzebujesz, do tych dostarczonych javax.ws.rs.core.Response.Statusbez dodawania żadnych dodatkowych zależności do projektu.

javax.ws.rs.core.Response.Statusto tylko jedna implementacja javax.ws.rs.core.Response.StatusTypeinterfejsu. Musisz po prostu stworzyć własne wyliczenie implementacji z definicjami odpowiednich kodów stanu.

Biblioteki podstawowe, takie jak Javax, Jersey itp., Są zapisywane w interfejsie, a StatusType nie w implementacji Status (a na pewno powinny ). Ponieważ nowe enum statusu implementuje StatusType, można go używać w dowolnym miejscu, w którym byś używałjavax.ws.rs.core.Response.Status stałej.

Pamiętaj tylko, że Twój własny kod powinien być również zapisany w StatusTypeinterfejsie. Umożliwi to używanie zarówno własnych kodów stanu, jak i „standardowych”.

Oto podstawa z prostą implementacją ze stałymi zdefiniowanymi dla kodów statusu „Informacyjnych 1xx”: https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a


5

Użyj klasy javax.servlet.http.HttpServletResponse

Przykład:

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

4
dla rozwoju klienta uciążliwe jest włączenie całego API serwletu tylko po to, aby odebrać te kody.
Jeffrey Blattman

1
W niektórych przypadkach może to być uciążliwe, ale znalazłem tę dobrą odpowiedź i piszę aplikację internetową opartą na serwletach, więc jest dla mnie dobra.
Andrei Rînea

2
Duplikat odpowiedzi, opublikowany ponad trzy lata później? Należy usunąć.
zb226,

4

1) Aby uzyskać tekst przyczyny, jeśli masz tylko kod, możesz użyć:

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

Gdzie httpCodebyłby kod przyczyny otrzymany z odpowiedzi HTTP.

Szczegółowe informacje można znaleźć na stronie https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.html

2) Aby uzyskać kod przyczyny, jeśli masz tylko tekst, możesz użyć BasicHttpResponse.

Zobacz szczegóły: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html



0

Najlepszym dostawcą dla stałych kodu stanu http prawdopodobnie będzie klasa Jetty's org.eclipse.jetty.http.HttpStatus, ponieważ:

  • w maven znajduje się pakiet javadoc, który jest ważny, jeśli szukasz stałej i znasz tylko numer -> po prostu otwórz stronę dokumentacji API i wyszukaj numer
  • stałe zawierają sam numer kodu statusu.

Jedyne, co bym poprawił: umieść numer kodu stanu przed opisem tekstowym, aby wyszukiwanie autouzupełniania było bardziej wygodne, gdy zaczynasz od kodu.


-1

Inną opcją jest użycie HttpStatusklasy z Apache commons-httpclient, która zapewnia różne statusy HTTP jako stałe.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.