XMLHttpRequest() 的 POST 请求返回 405 错误; 方法不允许。

5

我的HTML代码:

    <h2>Please finalize your details</h2>
    <form id="details" method="post" class="form">

        Full name: <strong name="name_1">ABCDEF</strong><br><br>
        ID No:<strong name="org_number_1">123</strong><br><br>
        Mobile No:<strong name="ph_number_1"">1234567890</strong><br><br>
        
        E-mail: <strong name="email_1">ABC@DEF.COM</strong><br><br>
        ID Card: <img src="profile.png" alt="preview" name="image" style="width: 100px; height: 100px;"><br><br>

        <button id="go">It's correct</button>
        
    </form>

我的JavaScript:

document.getElementById('go').addEventListener('click', submit);
function submit(){

    var nme=document.getElementsByName("name_1")[0].innerHTML;
    var id=document.getElementsByName("org_number_1")[0].innerHTML;
    var phone=document.getElementsByName("ph_number_1")[0].innerHTML;
    var email=document.getElementsByName("email_1")[0].innerHTML;
    var img=document.getElementsByName("image")[0].src;

    const xhr=new XMLHttpRequest();

    xhr.onload=function(){

        const serverResponse=document.getElementById("response");
        serverResponse.innerHTML=this.responseText;
    };

    xhr.open("POST", "database_registration.php");
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhr.send("name="+nme+"&id="+id+"&phone="+phone+"&email="+email+"&img="+img); //this line throws the error "Failed to load resource: the server responded with a status of 405 (Method Not Allowed)"
}

我正在使用Visual Studio Code编辑器运行代码,我的项目位置在:

C:\Users\Abhishek\Desktop\Web-dev stuff\XAMPP\htdocs\Stack hack 20 20

这是出现的错误:

enter image description here

不仅如此,我还尝试使用Fetch API工作,但它也抛出了同样的错误。我该怎么办?如何让它正常工作?


你应该配置你的开发服务器以允许方法和POST请求。请查看此问答 Jquery Ajax request to an static html resource in Nginx causes a “405 Not Allowed” - Christos Lytras
5个回答

1
错误不在JS中,而是来自服务器。 database_registration.php 中有什么? 如果它没有处理POST,则我期望服务器返回405404意味着database_registration.php不存在,但405表示它确实存在,但不允许特定的POST请求。检查响应的allow头部所支持的方法。
尝试:
    xhr.open("GET", "database_registration.php?" + 
        "name="+nme+"&id="+id+"&phone="+phone+"&email="+email+"&img="+img);
    xhr.send();

为了发送一个GET请求,请使用这个方法。
或者,可能是由于解析发布的内容时出现错误(错误报告为400406),请尝试删除部分主体以查看是否可以使用子集运行。

0

我同意@Keith的观点,这个错误代码通常表示您使用的请求方法不被服务器允许,但我发现并非所有开发人员在每种情况下都使用正确的错误代码。

我怀疑您提交的数据在后端存在解析问题,因为它在发送之前没有进行URI编码。

尝试使用以下JavaScript代码,看看是否会得到不同的结果:

document.getElementById('go').addEventListener('click', submit);
function submit() {

    const formData = new FormData();

    formData.append("name", document.getElementsByName("name_1")[0].innerHTML);
    formData.append("id", document.getElementsByName("org_number_1")[0].innerHTML);
    formData.append("phone", document.getElementsByName("ph_number_1")[0].innerHTML);
    formData.append("email", document.getElementsByName("email_1")[0].innerHTML);
    formData.append("img", document.getElementsByName("image")[0].src);

    const xhr = new XMLHttpRequest();

    xhr.onload = function() {
        const serverResponse = document.getElementById("response");
        serverResponse.innerHTML = this.responseText;
    };

    xhr.open("POST", "database_registration.php");
    xhr.send(formData);

}

0

我已经为您完成了第一个复选框(ID号)。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cafteria details</title>
    
    <style>
        #special{
            height: 100px;
            width: 100px;
            border: 1px solid;
            display: none;
        }
    </style>
</head>
<body>
    <h2>Cafeteria registration</h2>
    <form class="details">
        Full name: <input type="text" placeholder="Please avoid any kind of prefixes" id="name" size=25><br><br>
        Organization:<div id="org"><input onclick="myFunction()" type="checkbox" id="cb1">ID no: <input type="number" id="org_number"><br><br>
                     <input type="checkbox" id="cb2">Mobile No: <input type="tel" id="ph_number"></div><br><br>
        
        E-mail: <input type="email" id="email" size=25><br><br>
        Upload ID Card: <input type="file" name="id" accept=".pdf,.jpeg" id="img"><br><br>
        
    </form>
    <div id ="special">

    </div>
    <button id="button">Register</button>
    
</body>
<script>


function myFunction() {
  var x = document.getElementById("cb1").checked;
  if (x == true) {
    document.getElementById("special").style.display="block";
  }else{
    document.getElementById("special").style.display="none";
  }
  
}

// var x = document.getElementById("cb1").checked;
//     if (x==true){
//     document.getElementById("special").style.display="block";
//     console.log(true)
// }
// if (document.getElementById("cb2").checked==true){
//     document.getElementById("special").style.display="block";
//     console.log(false)
// }
</script>
</html>


虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - ppwater
这个问题涉及到 XMLHttpRequest AJAX POST,而不是你所建议的普通POST。-1 - Christos Lytras

0

你的代码看起来没问题。如果你正在使用Live Server vscode扩展运行你的代码,这是一个已知的问题(和这里)。

你可以尝试按照上面链接中建议的更改Live Server扩展的端口号设置,但最好的选择是停止使用Live Server来运行此代码。

只需启动XAMPP并在浏览器中导航到正确的URL(请注意,您必须将项目文件夹名称中的空格替换为类似stack-hack-20-20的内容)。

编辑:似乎也适用于其他一些vscode扩展。当您尝试访问端点时,会收到405状态。使用GET、HEAD或OPTIONS http方法存在某些限制,因此您可以使用其中一种方法命中端点,或者使用像XAMPP这样的Web服务器进行POST、DELETE等操作。


0
尝试在您的后端PHP应用程序上创建支持POST请求的新URL端点,以便您从JavaScript发送的HTTP请求可以使用POST请求。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接