HTTPQUERY
English

300 Multiple Choices

用法

收到 300 Multiple Choices 状态码时,消息体内容会因请求方法的不同而不同。HEAD 请求不包含消息体。对于其他方法,消息体中包含一个列表,客户端从中选择最合适的响应。

对于非 HEAD 响应,消息体中包含可用选项的列表。同时会使用带 rel=“alternate” 的 Link 头来标识每个选项。如果存在默认响应,或服务器有偏好的选项,则会用 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