使用AJAX调用PHP cURL接口返回405 Method Not Allowed如何解决
问题1:调用本地PHP返回405 Method Not Allowed 解决方案
405错误核心原因是你当前使用的8080端口服务是纯静态web服务器(比如VSCode Live Server、Nginx静态服务),未配置PHP解析能力,也不支持POST请求访问.php后缀的文件。
解决步骤:
- 安装PHP集成运行环境(如XAMPP、WAMP、phpStudy),将整个项目文件夹移入集成环境的web根目录(XAMPP对应htdocs目录,WAMP对应www目录)
- 启动集成环境的Apache服务,通过
http://localhost/你的项目目录名/index.html访问页面,不要使用8080端口的静态服务地址 - 可在
getCountryInfo.php最开头添加OPTIONS请求兼容逻辑,避免浏览器预检请求异常:
<?php // 新增这段预检处理逻辑 if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { exit(0); } // 原有代码保持不变 header("Access-Control-Allow-Origin: *"); // ... 其余原有代码
- 验证PHP侧是否正常:直接在浏览器地址栏访问
http://localhost/task/libs/php/getCountryInfo.php?language=en&country=GB,如果返回正常JSON结构,说明PHP服务运行正常。
问题2:直接调用第三方API返回结构不匹配解决方案
直接请求GeoNames接口报错的原因是:第三方接口返回结构没有你在PHP代码中自定义封装的status、data字段,接口返回的数据集直接存放在geonames字段中,同时你写的请求URL还混入了PHP代码片段,属于无效地址。
如果要直接使用第三方接口,修改script.js对应代码即可:
$('#btnOne').click(function() { $.ajax({ // 修改为正确的第三方接口地址,删除混入的PHP代码 url: "http://api.geonames.org/countryInfoJSON?formatted=true&username=yajarobe&style=full", type: 'GET', // 第三方接口仅支持GET请求,用POST也会报错 dataType: 'json', data: { country: $('#selCountry').val(), lang: $('#selLanguage').val() // 注意第三方接口的语言参数名是lang,不是language }, success: function(result) { console.log('AJAX call successful.'); console.log(JSON.stringify(result)); // 适配第三方接口返回结构 if (result?.geonames?.length > 0) { const data = result.geonames[0]; $('#txtCountryCode').html(data['countryCode']); $('#txtCountryName').html(data['countryName']); $('#txtContinent').html(data['continent']); $('#txtCapital').html(data['capital']); $('#txtLanguages').html(data['languages']); $('#txtPopulation').html(data['population']); $('#txtArea').html(data['areaInSqKm']); } }, // 错误回调、完成回调保持不变即可 error: function(jqXHR, textStatus, errorThrown) { console.log(textStatus + ' : ' + errorThrown); console.log(jqXHR); }, complete: function(){ console.log('AJAX call completed'); } }); });
两种方案选择建议:优先使用PHP代理的方案,避免暴露你的GeoNames用户名,也方便后续统一处理接口返回格式、添加缓存等逻辑。
内容的提问来源于stack exchange,提问作者Yajarobe
相关产品推荐
相关产品推荐

