You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用外部API正常,JQuery调用报CORS策略错误求助

CORS策略错误排查与修复方案

问题说明

使用PHP调用外部API可正常运行,但改用JQuery调用时触发CORS策略错误,报错信息翻译如下:

从源地址访问XMLHttpRequest时被CORS策略阻止:对预检请求的响应未通过访问控制检查:它没有HTTP成功状态码。

代码对比与问题分析

原PHP代码(正常运行)

$curl = curl_init();
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: ' . $token,'Accept: application/json'));
curl_setopt($curl, CURLOPT_URL, 'http://api.evalu-8.com/employee/readall');//?active=true
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

$result = curl_exec($curl);
curl_close($curl);

原JQuery代码(触发错误)

$.ajax({
url:'http://api.evalu-8.com/employee/readall',
crossDomain:true,
type: 'GET',
headers: {
  'Access-Control-Allow-Origin': '*',
  'Content-Type':'application/json'
},
beforeSend: function (xhr) {
  xhr.setRequestHeader('Authorization: Bearer ', 'token');
},
success:function(response){
}
});

核心错误点

  1. 请求方法不匹配:PHP使用POST请求,但JQuery代码中写的是GET,若API仅允许POST请求,会直接导致预检请求失败。
  2. 请求头配置错误:
    • Access-Control-Allow-Origin是服务端返回的响应头,前端无需发送这个请求头,添加后反而会触发不必要的预检逻辑。
    • Authorization头格式错误:beforeSend中的写法把请求头的键和值搞反了,正确格式应为Bearer + 空格 + token。
  3. 基础认证缺失:PHP中设置了CURLAUTH_BASIC(基础HTTP认证),但JQuery代码未处理该逻辑,若API要求基础认证会导致请求被拒绝。

修复后的JQuery代码

$.ajax({
  url: 'http://api.evalu-8.com/employee/readall',
  type: 'POST', // 与PHP保持一致的请求方法
  headers: {
    'Accept': 'application/json', // 匹配PHP的Accept头
    'Content-Type': 'application/json'
  },
  beforeSend: function (xhr) {
    // 修正Authorization头格式
    xhr.setRequestHeader('Authorization', 'Bearer ' + token);
    // 若API需要基础HTTP认证,添加以下代码(替换username和password)
    // xhr.setRequestHeader('Authorization', 'Basic ' + btoa('username:password'));
  },
  success: function(response){
    console.log('请求成功:', response);
  },
  error: function(xhr, status, error){
    console.error('请求失败:', status, error);
  }
});

额外解决方案(若上述修改无效)

  • 服务端配置跨域:联系API提供者,确认服务端是否已配置Access-Control-Allow-Origin(允许你的前端域名)、Access-Control-Allow-Methods(允许POST等请求方法)、Access-Control-Allow-Headers(允许Authorization、Content-Type等头)。
  • PHP代理中转:如果无法修改API服务端,可在自己的PHP后端搭建代理接口,前端调用自己的PHP接口,再由PHP通过curl请求外部API(服务端之间的请求不受CORS限制)。

内容的提问来源于stack exchange,提问作者Nazia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:20:40