http的默认option请求
(2018-09-28 09:06:43)分类: 技术 |
最近开发遇到这样一个问题,http的请求 无论是post和get都会发两个http请求。如果是get会先发一个http
option请求,在发一个http get请求。如果是post,会先发一个http option请求,再发一个http post请求。
如果两个http请求间隔时间很短小于五秒,那么option请求就不会出现。
复现条件是
设置了
http头 Content-Type=
'application/json;charset=utf-8 ',
后来查了http协议,如果头是json格式的话,http会先发一个option协议探测服务端是否支持这个格式,以及跨域访问的支持。简单来说就是先派一个排头兵去探探路,如果这个路通了再派大军去访问。
如果设置Content-Type=
'application/x-www-form-urlencoded那么就不会发option去探路。
默认情况下,以flyio为例 get会采用Content-Type=
'application/x-www-form-urlencoded这个头,post会采用application/json;charset=utf-8这个头,所以我们很多地方就会看到post的时候会先发一个option,而get的时候没有。
本质原因是因为Content-Type这个 参数造成的。
我们后台需要对option方法做一些特殊的处理,加快对option的返回。
那么既然application/json访问会增加访问次数,为什么还需要用这个格式呢。因为有些前端需要传很复杂的json,application/x-www-form-urlencoded这个格式无法满足,它只能支持一层简单的json,复杂的多层json无法实现。因此就需要用application/json这个格式,把复杂的json转化为json字符串来传。
注:如果不使用contentType:
“application/json”,也就是说contentType为空的时候,则data可以是对象