O Java possui uma enumeração completa para códigos de resposta HTTP?

267

Gostaria de saber se existe um tipo de enum em alguma biblioteca de classes Java padrão que define constantes simbólicas para todos os códigos de resposta HTTP válidos. Ele deve suportar a conversão de / para os valores inteiros correspondentes.

Estou depurando algum código Java que usa javax.ws.rs.core.Response.Status. Funciona, mas define apenas cerca de metade dos códigos de resposta HTTP válidos.

Zoltan Szilagyi
fonte

Respostas:

280

Eu não acho que exista um que seja completo nas classes Java padrão; HttpURLConnectionestá faltando alguns códigos, como HTTP 100/Continue.

Porém, há uma lista completa no Apache HttpComponents:
org.apache.http.HttpStatus(substituído org.apache.commons.HttpClient.HttpStatusno Apache Http Client, que chegou ao fim da vida útil )

John Feminella
fonte
5
Não existe uma lista completa, pois os códigos de status podem ser ampliados.
Julian Reschke
16
@JulianReschke Eu acho que "completo" aqui deve ser entendido como "está em conformidade com todos os códigos descritos pelo padrão".
22412 John Feminella
2
João: "o padrão" não define "todos" os códigos de status. É por isso que existe um registro.
Julian Reschke
1
iana.org/assignments/http-status-codes/http-status-codes.xml tem uma grande lista incluindo o código = 100
Garis M Suero
1
@ Donal: novamente, não é uma boa lista. O que é relevante é o registro da IANA.
Julian Reschke
66

A interface javax.servlet.http.HttpServletResponseda API do servlet possui todos os códigos de resposta na forma de intnomes de constantes SC_<description>. Consulte http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html

David Rabinowitz
fonte
3
O HttpServletResponse suporta o RFC1945 e parte dos padrões RFC2616, mas falta todo o RFC2518. Se você precisar de uma lista completa, consulte HttpStatus como eu mencionei.
John Feminella
2
HttpServletResponse também está faltando o código de resposta 418 definido na RFC 2324
daiscog
O uso de HttpServletResponse em qualquer coisa executada fora de um servlet provavelmente levará a problemas de dependência de diamante devido à sobreposição de classes em diferentes artefatos de servlet.
Elliotte Rusty Harold
51

Bem, existem constantes estáticas dos valores inteiros exatos na classe HttpURLConnection

Místico
fonte
6
THX! isso funciona sem nenhuma dependência externa. java.net.HttpURLConnection.HTTP_BAD_REQUEST
comonad 26/09/16
É bom que ele faça parte da biblioteca padrão, mas infelizmente está incompleto - na faixa de 400, por exemplo, é cortado em 415.
tschumann
18

Se você estiver usando o Spring, a versão 3.x tem o que você procura: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html

Ed J
fonte
3
Gostaria de acrescentar que o enum do Springs org.springframework.http.HttpStatus ( docs.spring.io/spring/docs/current/javadoc-api/org/… ) enum, é o único que eu poderia encontrar que fornece documentação em Java com links para a lista completa de códigos de status e seu uso em cada enumeração. Se você já estiver usando o Spring, essa seria a biblioteca a ser usada.
lastmannorth 7/07
2
Tem 100 e 418. Pena que você tem que ligar HttpStatus.XXX.value()para obter int.
WesternGun 14/03/19
7

Se você estiver usando o Netty , poderá usar:

Andrejs
fonte
infelizmente isso não é und enum, portanto, não utilizável em caso declarações (que me deixa triste)
Frederick Roth
7

Todo mundo parece estar ignorando a parte "tipo de enum" da sua pergunta.

Embora não haja uma fonte canônica para códigos de status HTTP, existe uma maneira simples de adicionar as constantes de status ausentes às necessárias, javax.ws.rs.core.Response.Statussem incluir dependências adicionais em seu projeto.

javax.ws.rs.core.Response.Status é apenas uma implementação do javax.ws.rs.core.Response.StatusType interface. Você só precisa criar sua própria enumeração de implementação com definições para os códigos de status que deseja.

Bibliotecas principais como Javax, Jersey etc. são gravadas na interface e StatusType não na implementação Status (ou certamente deveriam ser). Como a sua nova enumeração de status StatusTypeé implementada, ela pode ser usada em qualquer lugar que você use uma javax.ws.rs.core.Response.Statusconstante.

Lembre-se de que seu próprio código também deve ser gravado na StatusTypeinterface. Isso permitirá que você use seus próprios códigos de status, além dos códigos "padrão".

Aqui está uma lista com uma implementação simples com constantes definidas para os códigos de status "Informativo 1xx": https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a

David Avendasora
fonte
5

Use a classe javax.servlet.http.HttpServletResponse

Exemplo:

javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED //401
javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR //500
Andrés Canavesi
fonte
4
para o desenvolvimento do cliente, é oneroso incluir toda a API do servlet apenas para captar esses códigos.
Jeffrey Blattman
1
Pode ser oneroso em alguns casos, mas encontrei esta boa resposta e estou escrevendo um aplicativo Web baseado em servlet, portanto é bom para mim.
Andrei Rînea
2
Uma resposta duplicada, publicada mais de três anos depois? Deve ser excluído.
zb226
4

1) Para obter o texto do motivo , se você tiver apenas o código, você pode usar:

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

Onde httpCodeestaria o código de razão que você obteve da resposta HTTP.

Consulte https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.html para obter detalhes

2) Para obter o código de razão , se você tiver apenas o texto, você pode usar BasicHttpResponse.

Veja aqui para detalhes: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html

Maira Bay
fonte
0

O melhor provedor para constantes do código de status http provavelmente é a classe org.eclipse.jetty.http.HttpStatus do Jetty porque:

  • existe um pacote javadoc no maven, o que é importante se você procurar a constante e souber apenas o número -> basta abrir a página de documentos da API e procurar o número
  • as constantes contêm o próprio código de status.

A única coisa que eu melhoraria: coloque o número do código de status na frente da descrição do texto para tornar a pesquisa de preenchimento automático mais conveniente quando você iniciar o código.

user1050755
fonte
-1

Outra opção é usar a HttpStatusclasse do Apache commons-httpclient, que fornece os vários status Http como constantes.

ak123
fonte