预检请求(Preflight Request)是一种由浏览器自动发起的请求,用于检查实际请求是否安全可行。这种请求通常在跨域请求(CORS)中出现,并且只在某些特定条件下触发。以下是触发预检请求的具体条件:
请求方法不是简单方法之一(GET、HEAD 或 POST)。
POST请求的Content-Type不是简单请求头之一(application/x-www-form-urlencoded、multipart/form-data 或 text/plain)。
请求设置了自定义的头信息。
请求包含了可读流(即使用 ReadableStream 对象)。
当满足以上任一条件时,浏览器会首先发送一个OPTIONS请求到服务器,询问服务器是否允许实际的请求。如果服务器允许,浏览器才会发送实际的请求。这个OPTIONS请求就是所谓的预检请求。
在 HTTP 规范中,所谓的"简单请求"是指不会触发 CORS 预检请求的那些请求。简单请求需要满足以下所有条件:
只能是以下列出的方法之一:
GET
POST
HEAD人为设置的头信息字段只能是以下几种:
Accept
Accept-Language
Content-Language
Content-Type (但只限于三个值 application/x-www-form-urlencoded、multipart/form-data、text/plain)请求中的任何 XMLHttpRequestUpload 对象均没有注册任何事件监听器;也就是说,请求中没有使用 XMLHttpRequestUpload 对象。
请求中没有使用 ReadableStream 对象。
以上这些方法被称为简单方法,它们不会触发 CORS 预检请求。
- application/x-www-form-urlencoded 是一种 MIME 类型,常用于指定 HTTP 请求的内容类型(Content-Type)。当你发送一个 HTTP POST 请求时,需要在请求头中设置 Content-Type 来告诉服务器请求体的数据格式。
- 如果 Content-Type 的值被设置为 application/x-www-form-urlencoded,那么请求体中的数据会被编码为键值对,每对键值之间用 & 分隔,键与值之间用 = 分隔。这种编码方式与 URL 查询字符串的格式相同。
- 例如,如果你有一个 JavaScript 对象 {name: ‘John’, age: 30},那么在发送请求时,这个对象会被转换为字符串 ‘name=John&age=30’。
- 这种数据格式主要用于提交 HTML 表单数据,因为它能将复杂的表单数据转换为可在 URL 中传输的字符串。
- text/plain 是一种 MIME 类型,用于指定 HTTP 请求或响应的内容类型(Content-Type)。当你设置 Content-Type 为 text/plain 时,意味着你正在发送或接收纯文本数据。
- 这种类型通常用于发送不包含任何标记的纯文本。例如,如果你正在发送一个纯文本文件,或者你正在发送一个不包含 HTML 或其他代码的字符串,那么你应该使用 text/plain 类型。
- 需要注意的是,text/plain 不会对数据进行任何处理或编码,所以它不适合用于发送包含特殊字符的数据。例如,如果你需要发送包含 & 或 = 等特殊字符的数据,那么你应该使用 application/x-www-form-urlencoded 或 multipart/form-data 类型。