跳到主要内容

简单请求和复杂请求

· 阅读需 2 分钟
素明诚
Full stack development

简单请求

使用以下方法之一

  • GET
  • POST
  • HEAD

设置的头信息仅限于以下几种

  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type(但仅限于application/x-www-form-urlencodedmultipart/form-datatext/plain
  • 请求中的任何XMLHttpRequestUpload对象没有注册任何事件监听器;XMLHttpRequestUpload对象可以使用XMLHttpRequest.upload属性访问。
  • 请求中没有使用ReadableStream对象。

满足上述条件的请求被视为“简单请求”。简单请求不会触发 CORS 预检请求(这里指的是浏览器)。

复杂请求

不符合上述简单请求条件的请求被视为复杂请求。复杂请求在正式通信之前,会先发送一个预检请求(preflight request),这是一个使用OPTIONS方法的HTTP请求,向服务器询问实际请求是否安全可接受。

复杂请求的特点包括

  • 使用了除 GET、POST、HEAD 之外的 HTTP 方法(如 PUT、DELETE 等)。
  • 人为设置的头信息超出了简单请求允许的范围。
  • 向服务器发送了除允许的类型之外的Content-Type,如application/json

预检请求的目的是为了确保服务器明确允许跨源请求。服务器必须正确响应预检请求,提供相应的Access-Control-Allow-MethodsAccess-Control-Allow-Headers等 CORS 相关的响应头,表明服务器接受实际请求。只有当预检请求成功后,浏览器才会发送实际的请求。

简单请求和复杂请求的区别主要是为了安全考虑,通过这种机制,可以避免恶意网站对跨源资源进行未经授权的访问。其实我们可以发现,除了 GET、POST、HEAD 之外,其他类型的请求都涉及到修改数据库的内容,所以为了安全,需要进行预检。只要触发了预请求就是复杂请求

如果您喜欢这篇文章,不妨给它点个赞并收藏,感谢您的支持!