Есть ли в Java полное перечисление кодов ответов HTTP?


267

Мне интересно, есть ли тип enum в некоторой стандартной библиотеке классов Java, который определяет символические константы для всех допустимых кодов ответов HTTP. Он должен поддерживать преобразование в / из соответствующих целочисленных значений.

Я отлаживаю некоторый код Java, который использует javax.ws.rs.core.Response.Status. Это работает, но определяет только половину действительных кодов ответов HTTP.

Ответы:


280

Я не думаю, что есть один, который завершен в стандартных классах Java; HttpURLConnectionотсутствует довольно много кодов, вроде HTTP 100/Continue.

Тем не менее, в Apache HttpComponents есть полный список:
org.apache.http.HttpStatus(заменено на org.apache.commons.HttpClient.HttpStatusApache Http Client, срок службы которого истек )


5
Нет такого понятия, как «полный список», так как коды состояния могут быть и действительно расширяются.
Джулиан Решке

16
@JulianReschke Я думаю, что «полный» здесь следует понимать как «соответствует всем кодам, указанным в стандарте».
Джон Феминелла

2
Джон: «стандарт» не определяет «все» коды статуса. Вот почему есть реестр.
Джулиан Решке

1
У iana.org/assignments/http-status-codes/http-status-codes.xml есть большой список, включающий код = 100
Гарис М Суеро

1
@Donal: опять же, не очень хороший список. Что важно, так это реестр IANA.
Джулиан Решке

66

Интерфейс javax.servlet.http.HttpServletResponseот сервлетного API имеет все коды ответов в виде intимен констант SC_<description>. См. Http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html.


3
HttpServletResponse поддерживает RFC1945 и часть стандартов RFC2616, но ему не хватает всего RFC2518. Если вам нужен полный список, смотрите HttpStatus, как я уже говорил.
Джон Феминелла

2
HttpServletResponse также отсутствует код ответа 418, определенный в RFC 2324
daiscog

Использование HttpServletResponse во всем, что выполняется вне сервлета, может привести к проблемам с алмазной зависимостью из-за перекрывающихся классов в различных артефактах сервлета.
Эллиот Расти Гарольд

51

Ну, есть статические константы точных целочисленных значений в классе HttpURLConnection


6
Спасибо! это работает без каких-либо внешних зависимостей. java.net.HttpURLConnection.HTTP_BAD_REQUEST
комонад

Хорошо, что это часть стандартной библиотеки, но, к сожалению, она неполная - например, в диапазоне 400 она обрывается на 415.
tschumann

18

Если вы используете Spring, версия 3.x имеет то, что вы ищете: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html


3
Я хотел бы добавить, что перечисление Springs org.springframework.http.HttpStatus ( docs.spring.io/spring/docs/current/javadoc-api/org/… ) перечисление, является единственным, который я могу найти, который предоставляет документацию Java со ссылками полный список кодов состояния и их использование в каждом перечислении. Если вы уже используете Spring, то это будет библиотека для использования.
последний раз

2
Он имеет 100 и 418. Жаль, что вам нужно позвонить, HttpStatus.XXX.value()чтобы получить Int.
WesternGun

7

Если вы используете Netty , вы можете использовать:


к сожалению, это не enum и, следовательно, не может использоваться в заявлениях case (что меня огорчает)
Фредерик Рот

7

Кажется, что все игнорируют часть вашего вопроса типа enum.

Хотя канонического источника для кодов состояния HTTP не существует, существует простой способ добавить любые недостающие константы состояния, которые вам нужны, к предоставленным javax.ws.rs.core.Response.Statusбез добавления каких-либо дополнительных зависимостей в ваш проект.

javax.ws.rs.core.Response.Statusэто только одна реализация javax.ws.rs.core.Response.StatusTypeинтерфейса. Вам просто нужно создать собственное перечисление реализации с определениями нужных вам кодов состояния.

Базовые библиотеки, такие как Javax, Jersey и т. Д., Записываются в интерфейс, а StatusType не в реализацию Status (или, безусловно, должны быть) Поскольку ваш новый enum Status реализует StatusTypeего, его можно использовать везде, где вы используете javax.ws.rs.core.Response.Statusконстанту.

Просто помните, что ваш собственный код также должен быть записан в StatusTypeинтерфейс. Это позволит вам использовать оба ваших собственных кода состояния наряду со «стандартными».

Вот суть простой реализации с константами, определенными для кодов состояния «Informational 1xx»: https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a


5

Используйте класс javax.servlet.http.HttpServletResponse

Пример:

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

4
для разработки клиента обременительно включать весь API сервлетов только для того, чтобы подобрать эти коды.
Джеффри Блатман

1
В некоторых случаях это может быть обременительным, но я нашел этот хороший ответ, и я пишу веб-приложение на основе сервлетов, так что это хорошо для меня.
Андрей Ринея

2
Повторный ответ, опубликованный через три года? Должен быть удален.
zb226

4

1) Чтобы получить текст причины, если у вас есть только код, вы можете использовать:

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

Где httpCodeбудет код причины, который вы получили из ответа HTTP.

См. Https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.html для получения подробной информации.

2) Чтобы получить код причины, если у вас есть только текст, вы можете использовать BasicHttpResponse.

Подробности смотрите здесь: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html.


2

Также проверьте класс Restlet Status:

http://www.restlet.org/documentation/1.1/api/org/restlet/data/Status.html


Очередной раз; Коды состояния являются расширяемыми, поэтому не может быть «полного» списка, если только он не пересматривается при каждом добавлении нового кода состояния в реестр IANA ( iana.org/assignments/http-status-codes )
Джулиан Решке,

0

Лучшим поставщиком констант кода статуса http, вероятно, будет класс org.eclipse.jetty.http.HttpStatus в Jetty, потому что:

  • в maven есть пакет javadoc, который важен, если вы ищете константу и знаете только номер -> просто откройте страницу api docs и найдите номер
  • константы содержат сам номер кода состояния.

Единственное, что я хотел бы улучшить: поставить код состояния перед текстовым описанием, чтобы сделать поиск автозаполнения более удобным, когда вы начинаете с кода.


-1

Другой вариант - использовать HttpStatusкласс из Apache commons-httpclient, который предоставляет различные состояния Http в качестве констант.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.