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