Чи має Java повний перелік кодів відповідей HTTP?


267

Мені цікаво, чи є тип переліку в певній стандартній бібліотеці класів Java, яка визначає символічні константи для всіх дійсних кодів відповідей HTTP. Він повинен підтримувати перетворення в / з відповідних цілих значень.

Я налагоджую деякий код Java, який використовує javax.ws.rs.core.Response.Status. Він працює, але визначає лише половину дійсних кодів відповідей HTTP.

Відповіді:


280

Я не думаю, що в стандартних класах Java є такий, який є повним; HttpURLConnectionне вистачає декількох кодів, як HTTP 100/Continue.

Хоча повний список в HttpComponeti Apache:
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
Garis M Suero

1
@Donal: знову ж, не дуже хороший список. Важливим є реєстр IANA.
Джуліан Решке

66

Інтерфейс javax.servlet.http.HttpServletResponseAPI сервлета має всі коди відповідей у ​​вигляді 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
comonad

Добре, що вона є частиною стандартної бібліотеки, але, на жаль, вона неповна - наприклад, у діапазоні 400 вона скорочується в 415.
tschumann

18

Якщо ви використовуєте Spring, випуск 3.x має те, що ви шукаєте: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html


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

2
Він налічує 100 і 418. Шкода, що вам доведеться зателефонувати, HttpStatus.XXX.value()щоб отримати int.
WesternGun

7

Якщо ви використовуєте Netty , ви можете використовувати:


на жаль, це не переслідування і, отже, не використовується в заявах справи (що мене сумно)
Фредерік Рот

7

Здається, всі ігнорують частину вашого питання "перерахунку".

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

javax.ws.rs.core.Response.Statusце лише одна реалізація javax.ws.rs.core.Response.StatusTypeінтерфейсу. Вам просто потрібно створити власну enum реалізації з визначеннями кодів статусу, який потрібно.

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

Просто пам’ятайте, що власний код також повинен бути записаний в StatusTypeінтерфейс. Це дозволить вам використовувати обидва власні коди статусу поряд із "стандартними".

Ось суть простої реалізації з константами, визначеними для кодів статусу "Інформаційний 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:

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


Знову ж таки; коди статусу можна розширити, тому не може бути "повного" списку, якщо він не буде переглянуто щоразу, коли до реєстру IANA додається новий код статусу ( iana.org/assignments/http-status-codes )
Джуліан Решке,

0

Найкращим провайдером констант коду статусу http, швидше за все, буде клас Jetty org.eclipse.jetty.http.HttpStatus, оскільки:

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

Єдине, що я вдосконалюю: поставте номер коду статусу перед текстовим описом, щоб зробити автоматичне завершення пошуку більш зручним, коли ви починаєте з коду.


-1

Іншим варіантом є використання HttpStatusкласу з Apache commons-httpclient, який надає вам різні статуси Http як константи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.