Accept
这里资源类型通过 MIME types 表示。 Accept 是浏览器发送的请求头,用于表示想要的资源类型。根据请求的上下文不同,所设置的 Accept 请求头会相应变化。服务器根据 content negotiation 规则选择最合适的类型设置 例如请求路由页面时,Chrome 设置 Accept 为
对于页面中的样式文件 css,其 Accept 为:
可用的值有以下几种:
Quality valueHeader 中逗号分隔的值,每项的权重,或优先级。
表示:
Content-Type用来表示资源的类型。某些情况下,浏览器会对资源的类型进行嗅探而忽略掉服务器返回的 支持的值有:
一般情况下,包含在由服务器发送给客户端的响应头里。但也存在浏览器发送给服务器的情况,比如 POST 请求,表单提交这种由浏览器向服务器发送数据的情况下。 表单的提交类型form 表单中,提交的内容类型通过
一个表单提交示例通过 koa.js 搭建一个简单的表单提交示例,以查看 Content-Type。 server.js const { createReadStream } = require("fs");
const Koa = require("koa");
const app = new Koa();
const router = require("koa-router")();
const koaBody = require("koa-body");
router
.get("/", async ctx => {
ctx.type = "html";
ctx.body = createReadStream("form.html");
})
.post(
"/submit",
koaBody({
multipart: true
}),
ctx => {
console.log("form data is:", ctx.request.body);
ctx.body = JSON.stringify(ctx.request.body);
}
);
app.use(router.routes());
app.listen(3000);
console.log(`server started at http://localhost:3000`); form.html <form action="/submit" method="POST" enctype="multipart/form-data">
foo:<input type="text" name="foo" />
bar:<input type="text" name="bar" />
<button type="submit">submit</button>
</form> 访问页面并提交后,可在 Chrome DevTools 网络面板看到, Request Headers
Form Data
内容协商/Content Negotiation前面提到客户端通过设置 Accept 请求头设置请求资源的类型,服务器根据 content negotiation 规则返回。 Content negotiation 是这么一种机制,同一 URI可响应多种资源,客户端可自行决定请求何种资源(譬如文档的语言,图片格式,文件编码类型)。 内容协商包含两种方式
除了 Accept ,用于主动发起内容协商的请求头还有
服务器驱动的内容协商由客户端发送一组期望的类型,服务器根据自己的算法决定出最合适的类型进行返回,具体实现因服务器类型而异。服务器驱动是最常见的方式,但其也有一些明显的缺点:
客户端驱动的内容协商得到真实资源前多了一次选择的请求。 参考 |
原文:https://www.cnblogs.com/Wayou/p/http_content_negotiation.html