jQuery .ajax() POST 请求抛出 405(不允许的方法)但 GET 不会

Posted

技术标签:

【中文标题】jQuery .ajax() POST 请求抛出 405(不允许的方法)但 GET 不会【英文标题】:jQuery .ajax() POST Request throws 405 (Method Not Allowed) but GET doesn't 【发布时间】:2017-01-27 01:54:06 【问题描述】:

我正在使用 ajax 进行表单更新。当我在 ajax 中使用 GET 方法时它工作正常,但是当我使用 Post 方法时它会抛出错误 405 方法不允许。我正在本地主机上对此进行测试。我以前在 localhost 中做过这个,效果很好。顺便说一句,我为此使用 Laravel 5.2。

这是我的 ajax 代码。

$('#update-modal').on('click',function()

$.ajax(

    method : "POST",
    url : updateURL,
    data :  client_id : $('#client_id').val(),
             client_name : $('#client_name').val(),
             client_business : $('#client_business').val(),
             client_ref : $('#client_ref').val(),
             gmail_mail : $('#gmail_mail').val(),
             gmail_pass : $('#gmail_pass').val(),
             client_dob : $('#client_dob').val(),
             client_addr : $('#client_addr').val(),
             client_no1 : $('#client_no1').val(),
             client_no2 : $('#client_no2').val(),
             domain_name : $('#domain_name').val(),
             domain_p_date : $('#domain_p_date').val(),
             domain_reg : $('#domain_reg').val(),
             domain_ex_date : $('#domain_ex_date').val(),
             domain_acc_email : $('#domain_acc_email').val(),
             domain_acc_pass :  $('#domain_acc_pass').val(),
             _token : token 

)
.done(function(msg)

    console.log(msg['message']);

);
);

这是我在视图中使用的脚本

        <script>
        var updateURL = ' route('updateDomain') ';
        var token = 'Session::token()';
        </script>

这是我的路线

Route::post('/updateDomainModal' ,function(\Illuminate\Http\Request $request)      
    return response()->json(['message'=> $request['client_name']]);
)->name('updateDomain');

当 ajax 函数和 Route 中的方法更改为 GET 时,它会打印在控制台中传递的客户端名称但是当使用 POST 方法执行相同操作时,它会抛出错误这是错误详细信息

jquery.min.js:2 GET http://localhost:8000/updateDomainModal?client_id=4&client_name=ABCD&client…2+15%3A01%3A40&domain_acc_email=abc123%40gmail.com&domain_acc_pass=123456 405 (Method Not Allowed)

【问题讨论】:

我猜想使用 post 方法,您需要将数据作为有效负载而不是作为查询参数发送。发送前在数据上尝试JSON.Stringify() 使用 type:"POST" 而不是 method:"POST" @Mir type 只是 method 的别名 服务器期望接收什么内容类型? @mdziekon 谢谢。可能是 OP 正在执行跨域 ajax 发布 【参考方案1】:

您在以 domain_acc_pass 开头的行中错误地使用了 。您应该在分配令牌值后使用该 ''。现在,令牌不会发送到目标,这是必需的。

【讨论】:

【参考方案2】:

使用类型“POST”

$.ajax(

      type : 'POST',
      url : updateURL,
      data :  client_id : $('#client_id').val(),
               client_name : $('#client_name').val(),
               client_business : $('#client_business').val(),
               client_ref : $('#client_ref').val(),
               gmail_mail : $('#gmail_mail').val(),
               gmail_pass : $('#gmail_pass').val(),
               client_dob : $('#client_dob').val(),
               client_addr : $('#client_addr').val(),
               client_no1 : $('#client_no1').val(),
               client_no2 : $('#client_no2').val(),
               domain_name : $('#domain_name').val(),
               domain_p_date : $('#domain_p_date').val(),
               domain_reg : $('#domain_reg').val(),
               domain_ex_date : $('#domain_ex_date').val(),
               domain_acc_email : $('#domain_acc_email').val(),
               domain_acc_pass :  $('#domain_acc_pass').val(),
               _token : token 

    );

如果您提交表单

$("#form-name" ).submit(function(ev) 
  ev.preventDefault();  
  var postData = $(this).serializeArray();
  var formURL = $(this).attr("action");
  $.ajax(
    url: formURL,       
    type: 'POST',
    data: postData, 
    success: function(data, textStatus, jqXHR)
       
      location.reload();    
    ,
    error: function(jqXHR, textStatus, errorThrown)
       
      consonle.log("error");
    
  );
);

【讨论】:

如果我把它改成从方法输入,我得到内部服务器错误

以上是关于jQuery .ajax() POST 请求抛出 405(不允许的方法)但 GET 不会的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Ajax 请求使用 post 方法抛出 MethodNotAllowedException

Laravel 5 App - AJAX Post请求不接受令牌并抛出500内部服务器错误

jQuery 的 Ajax 和Post 请求

jquery实现Ajax

将 jquery ajax POST 请求更改为 fetch api POST

jQuery与Ajax