【问题标题】:Ajax returns GET request instead of POSTAjax 返回 GET 请求而不是 POST
【发布时间】:2020-11-12 00:53:38
【问题描述】:

我正在尝试在 laravel 中创建一个个人消息系统,该系统的一部分是能够在不刷新整个页面的情况下以表单发送消息。

我一直在关注一些 youtube 教程,这是我目前掌握的 Ajax 脚本。

<form id="form{{$dm->id}}">
                    {{ csrf_field() }}
                    <input id="message" placeholder="Send a message" style="border-radius: 0px;" type="username" class="form-control" name="message">
                    <script>
                    $('form{{$dm->id}}').ready(function (){
                        
                    $('form{{$dm->id}}').on('submit', function( event ) {
                        event.preventDefault();
                        $.ajax({
                            type: 'post',
                            url: '{{ route("sendMessage", $dm->id) }}',
                            data: $('form{{$dm->id}}').serialize(), 
                            success: function(response){
                                alert('suces')
                            },
                            error: function(response){
                               alert('failure')
                            }
                        });
                    });
                    });
                    </script>
                </form>

它不是向控制器发送一个 POST 请求,而是发送一个 GET 请求并只是重定向。 这是我第一次搞乱 Ajax/Javascript,所以我不知道为什么这不起作用。

控制器脚本:

public function sendM(Request $request, $id)
{
    $validatedData = $request->validate([
        'message' => 'required|string|max:255|min:4',
    ]);
    
    $dm = Dm::find($id);
    $mess = new Message;
    $mess->Authid = Auth::user()->id;
    $mess->Userid = $dm->Userid;
    $mess->Dmid = $dm->id;
    $mess->message = $request->input('message');
    $dm->messages()->save($mess);
    $dm->touch();
}

路线入口:

Route::post('/sendmessage/id{id}', 'SettingsController@sendM')->name('sendMessage')->middleware('verified');

非常感谢任何帮助! (注意:对不起,如果它真的很明显)

【问题讨论】:

  • 添加:方法:'POST',
  • javascript 的完整上下文是什么?你确定这是正在执行的调用吗?你可以在 $.ajax 之前 console.log('start') 和之后 console.log('finish') ,并且只在浏览器控制台中看到'start'吗?如果您查看开发人员工具网络选项卡并选中“保留历史记录”会发生什么 - 网络活动是否符合您的预期?是否有任何意外重定向?
  • 当我在脚本中添加console.log('start')console.log('finish') 时,它似乎没有记录任何内容。在网络选项卡中,它只是重定向到带有信息的 GET 地址,而不是实际的 POST 请求。

标签: php ajax laravel


【解决方案1】:

在$.ajax调用中,需要将方法设置为post而不是type。

$.ajax({
        method: 'post',
        url: '{{ route("sendMessage", $dm->id) }}',
        data: $('form{{$dm->id}}').serialize(), 
        success: function(response){
          alert('suces')
        },
        error: function(response){
        alert('failure')
        }
       });

顺便说一句,jquery 通常被认为正在淘汰。你可能想看看 jquery 的一些替代品是什么样子的,比如 vue.js 或 react。针对 ajax 方面,Laravel 内置了 axios 支持。

【讨论】:

  • 你对 jquery 提出了一个很好的观点。我将研究 Vue/React,看看它们都提供了什么。如果你不介意我问,什么是 axios?
【解决方案2】:

不确定它是否能解决您的问题,但您还必须将 csrf 令牌添加到标头中:

$.ajaxSetup({
   headers: {
      'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
   }
});

(当然,如果令牌在元标记中)

【讨论】:

  • 我尝试添加标题,但每次仍然是相同的结果。
  • 我认为它不能解决您的问题,但无论如何都需要添加它们。
【解决方案3】:

方法的别名。如果您使用的是 1.9.0 之前的 jQuery 版本,则应该使用 type。

             <form id="form{{$dm->id}}">
                    {{ csrf_field() }}
                    <input id="message" placeholder="Send a message" style="border-radius: 0px;" type="username" class="form-control" name="message">
                    <script>
                    $('form{{$dm->id}}').ready(function (){
                        
                    $('form{{$dm->id}}').on('submit', function( event ) {
                        event.preventDefault();
                        $.ajax({
                            type: 'POST', //Check your JQ version.
                            method: 'POST', //Check your JQ version.
                            contentType:"multipart/form-data; charset=utf-8",
                            //url: '{{ route("sendMessage", $dm->id) }}',
                            url: '{{ route("sendmessage", $dm->id) }}',
                            data: $('form{{$dm->id}}').serialize(), 
                            success: function(response){
                                alert('suces')
                            },
                            error: function(response){
                               alert('failure')
                            }
                        });
                    });
                    });
                    </script>
                </form>

【讨论】:

  • typemethod 都试过了,不幸的是,没有一个可以工作。
  • 尝试添加 contentType:"multipart/form-data; charset=utf-8"
  • 这似乎也不起作用。结果都是一样的。
  • 检查你的路由是 '{{ route("sendMessage", $dm->id) }}' 或 '{{ route("sendMessage/", $dm->id) }}' ?在你的服务器端是: Route::post('/sendmessage/id{id}' with / between sendmessage 和 id ?
  • 我也观察到在 javascript 中你调用:sendMessage > Message with M with upperCaser 但在你的服务器端 Route::post('/sendmessage/id{id}', message 以 m 小写开头。 ?
猜你喜欢
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
相关资源
最近更新 更多