300 Multiple Choices
Применение
При получении кода состояния 300 Multiple Choices содержимое тела сообщения различается в зависимости от метода запроса. Запрос HEAD не содержит тела сообщения. Для остальных методов тело содержит список, из которого клиент выбирает наиболее подходящий ответ.
Для ответов не на HEAD тело содержит список доступных вариантов. Для обозначения каждого варианта также используется заголовок Link с rel=“alternate”. Если существует вариант по умолчанию или у сервера есть предпочтительный выбор, этот выбор обозначается заголовком Location.
Пример
Клиент запрашивает ресурс, и сервер предлагает несколько вариантов. Заголовки содержат пути к каждому ресурсу. Поскольку это ответ на запрос GET, тело содержит кликабельный список вариантов.
Запрос
GET /tech-news HTTP/1.1
Host: example.com
Ответ
HTTP/1.1 300 Multiple Choices
Link: </leading/news.html>; rel="alternate"
Link: </bleeding/news.html>; rel="alternate"
Location: </leading/news.html>
Content-Type: text/html
Content-Length: 164
<h2>Choose from one of the following</h2>
<ul>
<li><a href=/leading/news.html>Leading edge</a>
<li><a href=/bleeding/news.html>Bleeding edge</a>
</ul>
Поведение браузера
Большинство браузеров при получении ответа 300 не показывают интерфейс выбора. При наличии заголовка Location браузеры обычно автоматически следуют предпочтительному варианту, как при перенаправлении 302. Без заголовка Location браузер отображает тело ответа, содержащее список доступных вариантов. На практике 300 встречается редко, поскольку согласование содержимого (Content-Negotiation) выбирает формат прозрачно.
Примеры кода
.NET
HttpStatusCode.MultipleChoices
Rust
http::StatusCode::MULTIPLE_CHOICES
Rails
:multiple_choices
Go
http.StatusMultipleChoices
Symfony
Response::HTTP_MULTIPLE_CHOICES
Python3.5+
http.HTTPStatus.MULTIPLE_CHOICES
Java
java.net.HttpURLConnection.HTTP_MULT_CHOICE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_MULTIPLE_CHOICES
Angular
@angular/common/http/HttpStatusCode.MultipleChoices