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.

Zoltan Szilagyi
źródło

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 )

John Feminella
źródło
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
iana.org/assignments/http-status-codes/http-status-codes.xml ma dużą listę zawierającą kod = 100
Garis M Suero
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

David Rabinowitz
źródło
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

Mistyk
źródło
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

Jeśli używasz Springa, wersja 3.x ma to, czego szukasz: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html

Ed J
źródło
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

Jeśli korzystasz z Netty , możesz użyć:

Andrejs
źródło
niestety nie jest to wyliczenie i dlatego nie nadaje się do oświadczeń w sprawie (co mnie smuci)
Frederick Roth
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

David Avendasora
źródło
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
Andrés Canavesi
źródło
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

Zatoka Maira
źródło
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.

użytkownik1050755
źródło
-1

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

ak123
źródło