Java ha un'enumerazione completa per i codici di risposta HTTP?


270

Mi chiedo se esiste un tipo enum in una libreria di classi Java standard che definisce costanti simboliche per tutti i codici di risposta HTTP validi. Dovrebbe supportare la conversione da / verso i valori interi corrispondenti.

Sto eseguendo il debug di un codice Java che utilizza javax.ws.rs.core.Response.Status. Funziona, ma definisce solo circa la metà dei codici di risposta HTTP validi.

Risposte:


286

Non credo che ce ne sia uno completo nelle classi Java standard; HttpURLConnectionmanca un bel po 'di codici, come HTTP 100/Continue.

C'è un elenco completo in Apache HttpComponents, però:
org.apache.http.HttpStatus(sostituito org.apache.commons.HttpClient.HttpStatusda Apache Http Client, che ha raggiunto la fine del ciclo di vita )


6
Non esiste un "elenco completo", poiché i codici di stato possono essere e vengono estesi.
Julian Reschke

16
@JulianReschke Penso che "completo" qui dovrebbe essere interpretato come "conforme a tutti i codici delineati dallo standard".
John Feminella

3
John: "lo standard" non definisce "tutti" i codici di stato. Ecco perché esiste un registro.
Julian Reschke

2
iana.org/assignments/http-status-codes/http-status-codes.xml ha una grande lista che include il codice = 100
Garis M Suero

2
@Donal: ancora una volta, non una buona lista. Ciò che è rilevante è il registro IANA.
Julian Reschke

70

L'interfaccia javax.servlet.http.HttpServletResponsedall'API servlet ha tutti i codici di risposta sotto forma di intnomi di costanti SC_<description>. Vedi http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html


3
HttpServletResponse supporta RFC1945 e parte degli standard RFC2616, ma manca tutto RFC2518. Se hai bisogno di un elenco completo, vedi HttpStatus come ho detto.
John Feminella,

2
In HttpServletResponse manca anche il codice di risposta 418 definito in RFC 2324
daiscog

L'uso di HttpServletResponse in qualsiasi cosa che viene eseguita al di fuori di un servlet potrebbe portare a problemi di dipendenza diamond a causa della sovrapposizione di classi in diversi artefatti servlet.
Elliotte Rusty Harold,


19

Se stai usando Spring, la versione 3.x ha quello che stai cercando: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html


3
Vorrei aggiungere che Springs org.springframework.http.HttpStatus ( docs.spring.io/spring/docs/current/javadoc-api/org/… ) enum, è l'unico che ho trovato che fornisce documentazione Java con collegamenti all'elenco completo dei codici di stato e del loro utilizzo in ogni enum. Se stai già usando Spring, questa sarebbe la libreria da usare.
lastmannorth

2
Ha 100 e 418. Peccato che tu debba chiamare HttpStatus.XXX.value()per ottenere int.
WesternGun

9

Tutti sembrano ignorare la parte "tipo enumerazione" della tua domanda.

Sebbene non esista una fonte canonica per i codici di stato HTTP, esiste un modo semplice per aggiungere eventuali costanti di stato mancanti di cui hai bisogno a quelle fornite da javax.ws.rs.core.Response.Statussenza aggiungere ulteriori dipendenze al tuo progetto.

javax.ws.rs.core.Response.Statusè solo un'implementazione javax.ws.rs.core.Response.StatusTypedell'interfaccia. Devi semplicemente creare la tua enumerazione di implementazione con le definizioni per i codici di stato che desideri.

Le librerie principali come Javax, Jersey, ecc. Sono scritte sull'interfaccia e StatusType non sull'implementazione Status (o certamente dovrebbero esserlo). Poiché il tuo nuovo stato enum implementa StatusType, può essere utilizzato ovunque tu usi una javax.ws.rs.core.Response.Statuscostante.

Ricorda solo che anche il tuo codice dovrebbe essere scritto StatusTypesull'interfaccia. Ciò ti consentirà di utilizzare entrambi i tuoi codici di stato insieme a quelli "standard".

Ecco una sintesi con una semplice implementazione con costanti definite per i codici di stato "Informational 1xx": https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a


7

Se stai usando Netty , puoi usare:


sfortunatamente questo non è un enum e quindi non è utilizzabile nelle dichiarazioni del caso (il che mi rattrista)
Frederick Roth

5

Utilizza la classe javax.servlet.http.HttpServletResponse

Esempio:

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

4
per lo sviluppo del client, è oneroso includere l'intera API servlet solo per raccogliere questi codici.
Jeffrey Blattman

1
Potrebbe essere gravoso per alcuni casi, ma ho trovato questa buona risposta e sto scrivendo un'app Web basata su servlet, quindi è un bene per me.
Andrei Rînea

2
Una risposta duplicata, pubblicata più di tre anni dopo? Dovrebbe essere cancellato.
zb226

4

1) Per ottenere il testo del motivo se hai solo il codice, puoi utilizzare:

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

Dove httpCodesarebbe il codice motivo ottenuto dalla risposta HTTP.

Vedi https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.html per i dettagli

2) Per ottenere il codice motivo se hai solo il testo, puoi usare BasicHttpResponse.

Vedi qui per i dettagli: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html



0

Il miglior provider per le costanti del codice di stato http è probabilmente la classe org.eclipse.jetty.http.HttpStatus di Jetty perché:

  • c'è un pacchetto javadoc in Maven che è importante se cerchi la costante e conosci solo il numero -> apri semplicemente la pagina dei documenti api e cerca il numero
  • le costanti contengono il numero del codice di stato stesso.

L'unica cosa che potrei migliorare: mettere il numero del codice di stato davanti alla descrizione del testo per rendere più comoda la ricerca del completamento automatico quando si inizia con il codice.


-1

Un'altra opzione è usare la HttpStatusclasse da Apache commons-httpclient che fornisce i vari stati Http come costanti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.