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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:45:03