为什么我的$ .ajax显示"预检是无效的重定向错误"?

Jen*_*on 50 javascript ajax jquery

我在Postman中尝试了以下代码并且它正在工作.代码有问题吗?

$.ajax({
   url: 'http://api.example.com/users/get',
   type: 'POST',
   headers: {
      'name-api-key':'ewf45r4435trge',
   },
   data: {
      'uid':36,
   },
   success: function(data) {
      console.log(data);
   }
});
Run Code Online (Sandbox Code Playgroud)

我在我的控制台中收到如下错误,请指教.

XMLHttpRequest无法加载http://api.example.com/users/get预检的响应无效(重定向)

Pet*_* T. 32

当我尝试将https Web服务称为http webservice时,我收到了同样的错误.

e.g when I call url 'http://api.example.com/users/get'
which should be 'https://api.example.com/users/get'
Run Code Online (Sandbox Code Playgroud)

当您尝试调用http而不是https时,由于重定向状态302而产生此错误.


Jos*_*vid 24

这个答案完全相同(虽然对于角度) - 这是一个CORS问题.

一个快速解决方法是通过指定一个不会触发"预检" 的"Content-Type"标题值来修改每个POST请求.这些类型是:

  • 应用程序/ x-WWW窗体-urlencoded
  • 多部分/格式数据
  • 纯文本/

任何ELSE都会触发预检.

例如:

$.ajax({
   url: 'http://api.example.com/users/get',
   type: 'POST',
   headers: {
      'name-api-key':'ewf45r4435trge',
      'Content-Type':'application/x-www-form-urlencoded'
   },
   data: {
      'uid':36,
   },
   success: function(data) {
      console.log(data);
   }
});
Run Code Online (Sandbox Code Playgroud)


Pla*_*nky 6

该错误表明预检正在获得重定向响应.这可能由于多种原因而发生.找出你被重定向到哪里以寻找它为什么会发生的线索.检查开发人员工具中的网络选项卡.

正如@Peter T所提到的,一个原因是API可能需要HTTPS连接而不是HTTP,并且所有通过HTTP的请求都会被重定向.响应Location返回的标题302会说明在这种情况下http更改为相同的URL https.

另一个原因可能是您的身份验证令牌未被发送或不正确.大多数服务器都设置为将所有不包含身份验证令牌的请求重定向到登录页面.再次,检查您的Location标题,看看这是否是您发送的地方,并查看确保浏览器发送您的身份验证令牌与请求.

通常,服务器将配置为始终将没有auth令牌的请求重定向到登录页面 - 包括您的预检/ OPTIONS请求.这是个问题.更改服务器配置以允许OPTIONS来自未经身份验证的用户的请求.


小智 5

请在标头中设置http内容类型,并确保服务器正在验证CORS.这是在PHP中如何做到这一点:

//NOT A TESTED CODE
header('Content-Type: application/json;charset=UTF-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: DELETE, HEAD, GET, OPTIONS, POST, PUT');
header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description');
header('Access-Control-Max-Age: 1728000');
Run Code Online (Sandbox Code Playgroud)

请参阅:

http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

Access-Control-Allow-Origin标头如何工作?


eha*_*nom 5

我的问题是POST请求需要尾随斜杠'/'.