Verfügt Java über eine vollständige Aufzählung der HTTP-Antwortcodes?

267

Ich frage mich, ob es in einer Standard-Java-Klassenbibliothek einen Aufzählungstyp gibt, der symbolische Konstanten für alle gültigen HTTP-Antwortcodes definiert. Es sollte die Konvertierung in / von den entsprechenden Ganzzahlwerten unterstützen.

Ich debugge Java-Code, der javax.ws.rs.core.Response.Status verwendet. Es funktioniert, definiert aber nur etwa die Hälfte der gültigen HTTP-Antwortcodes.

Zoltan Szilagyi
quelle

Antworten:

280

Ich glaube nicht, dass es eine gibt, die in den Standard-Java-Klassen vollständig ist. HttpURLConnectionfehlt eine ganze Reihe von Codes, wie HTTP 100/Continue.

Es gibt jedoch eine vollständige Liste in den Apache HttpComponents:
org.apache.http.HttpStatus(ersetzt org.apache.commons.HttpClient.HttpStatusdurch den Apache Http Client, der das Ende seiner Lebensdauer erreicht hat )

John Feminella
quelle
5
Es gibt keine "vollständige Liste", da Statuscodes erweitert werden können und werden.
Julian Reschke
16
@JulianReschke Ich denke, "vollständig" sollte hier so verstanden werden, dass es "allen im Standard festgelegten Codes entspricht".
John Feminella
2
John: "Der Standard" definiert nicht "alle" Statuscodes. Deshalb gibt es eine Registrierung.
Julian Reschke
1
iana.org/assignments/http-status-codes/http-status-codes.xml haben eine große Liste mit dem Code = 100
Garis M Suero
1
@Donal: wieder keine gute Liste. Relevant ist die IANA-Registrierung.
Julian Reschke
66

Die Schnittstelle javax.servlet.http.HttpServletResponsevon der Servlet-API enthält alle Antwortcodes in Form von intKonstantennamen SC_<description>. Siehe http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html

David Rabinowitz
quelle
3
HttpServletResponse unterstützt den RFC1945 und einen Teil der RFC2616-Standards, es fehlt jedoch der gesamte RFC2518. Wenn Sie eine vollständige Liste benötigen, lesen Sie HttpStatus, wie bereits erwähnt.
John Feminella
2
HttpServletResponse fehlt auch der 418-Antwortcode, der in RFC 2324
daiscog
Die Verwendung von HttpServletResponse in allen Bereichen, die außerhalb eines Servlets ausgeführt werden, führt aufgrund überlappender Klassen in verschiedenen Servlet-Artefakten wahrscheinlich zu Problemen mit der Diamantabhängigkeit.
Elliotte Rusty Harold
51

Nun, es gibt statische Konstanten der exakten Ganzzahlwerte in der HttpURLConnection- Klasse

Mystiker
quelle
6
Vielen Dank! Dies funktioniert ohne externe Abhängigkeiten. java.net.HttpURLConnection.HTTP_BAD_REQUEST
Comonad
Gut, dass es Teil der Standardbibliothek ist, aber leider unvollständig - im Bereich 400 beispielsweise wird es um 415
abgeschnitten.
18

Wenn Sie Spring verwenden, hat die Version 3.x genau das, wonach Sie suchen: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html

Ed J.
quelle
3
Ich möchte hinzufügen, dass Springs org.springframework.http.HttpStatus ( docs.spring.io/spring/docs/current/javadoc-api/org/… ) die einzige ist, die Java-Dokumentation mit Links bereitstellt zur vollständigen Liste der Statuscodes und ihrer Verwendung in jeder Aufzählung. Wenn Sie Spring bereits verwenden, ist dies die zu verwendende Bibliothek.
Lastmannorth
2
Es hat 100 und 418. Schade, dass Sie anrufen müssen HttpStatus.XXX.value(), um int zu bekommen.
WesternGun
7

Wenn Sie Netty verwenden , können Sie Folgendes verwenden:

Andrejs
quelle
Leider ist dies keine Aufzählung und daher nicht verwendbar für Fallaussagen (was mich traurig macht)
Frederick Roth
7

Jeder scheint den "Aufzählungstyp" -Teil Ihrer Frage zu ignorieren.

Zwar gibt es keine kanonische Quelle für HTTP - Statuscodes ist , gibt es eine einfache Möglichkeit, fügen Sie alle fehlenden Status - Konstanten , die Sie zu dem von versehen müssen , javax.ws.rs.core.Response.Statusohne sie durch zusätzliche Abhängigkeiten zu Ihrem Projekt.

javax.ws.rs.core.Response.Statusist nur eine Implementierung der javax.ws.rs.core.Response.StatusTypeSchnittstelle. Sie müssen lediglich eine eigene Implementierungsaufzählung mit Definitionen für die gewünschten Statuscodes erstellen.

Core - Bibliotheken wie Javax, Jersey, etc. auf die schriftliche Schnittstelle StatusType nicht die Implementierung Status (oder sie sicherlich sollte sein). Da Ihre neue Statusaufzählung implementiert wird StatusType, kann sie überall dort verwendet werden, wo Sie eine javax.ws.rs.core.Response.StatusKonstante verwenden würden .

Denken Sie daran, dass Ihr eigener Code auch in die StatusTypeBenutzeroberfläche geschrieben werden sollte. Auf diese Weise können Sie neben den "Standard" -Codes auch Ihre eigenen Statuscodes verwenden.

Hier ist eine Übersicht mit einer einfachen Implementierung mit Konstanten, die für die Statuscodes "Informational 1xx" definiert sind: https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a

David Avendasora
quelle
5

Verwenden Sie die Klasse javax.servlet.http.HttpServletResponse

Beispiel:

javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED //401
javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR //500
Andrés Canavesi
quelle
4
Für die Client-Entwicklung ist es mühsam, die gesamte Servlet-API einzuschließen, um diese Codes abzurufen.
Jeffrey Blattman
1
In einigen Fällen mag es lästig sein, aber ich habe diese gute Antwort gefunden und schreibe eine Servlet-basierte Web-App, damit sie gut für mich ist.
Andrei Rînea
2
Eine doppelte Antwort, die über drei Jahre später veröffentlicht wurde? Sollte gelöscht werden.
zb226
4

1) Um den Grundtext zu erhalten, wenn Sie nur den Code haben, können Sie Folgendes verwenden:

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

Wo httpCodewäre der Ursachencode, den Sie von der HTTP-Antwort erhalten haben?

Weitere Informationen finden Sie unter https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.html

2) Um den Ursachencode zu erhalten , wenn Sie nur den Text haben, können Sie verwenden BasicHttpResponse.

Weitere Informationen finden Sie hier: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html

Maira Bay
quelle
0

Der beste Anbieter für Konstanten des http-Statuscodes ist wahrscheinlich die org.eclipse.jetty.http.HttpStatus-Klasse von Jetty, weil:

  • Es gibt ein Javadoc-Paket in Maven, das wichtig ist, wenn Sie nach der Konstante suchen und nur die Nummer kennen -> öffnen Sie einfach die Seite mit den API-Dokumenten und suchen Sie nach der Nummer
  • Die Konstanten enthalten die Statuscode-Nummer selbst.

Das einzige, was ich verbessern würde: Setzen Sie die Statuscode-Nummer vor die Textbeschreibung, um die Suche nach automatischer Vervollständigung bequemer zu gestalten, wenn Sie mit dem Code beginnen.

user1050755
quelle
-1

Eine andere Option ist die Verwendung einer HttpStatusKlasse aus dem Apache commons-httpclient, die Ihnen die verschiedenen HTTP-Status als Konstanten bereitstellt.

ak123
quelle