Laravel发送了GET请求而不是POST请求

5

我在使用Laravel进行POST请求时遇到了问题。我的路由定义为POST,AJAX中使用的方法也是POST,但它一直发送GET请求。如果我将路由更改为未定义的路由,则会发送POST请求,但是如果我指定为POST的这个路由则会发送GET请求。

AJAX:

$.ajax({
    method: "POST",
    url: "{{ url('admin/rentacar/save_availability_for_d') }}",
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    },
    data: $(form).serialize(),
    dataType: "json",
    success(result){
        //
    }
});

路由被定义为:

Route::post('save_availability_for_d', [
    'as' => 'save_availability_for_d', 
    'uses' => 'RentacarController@saveCarAdjustment'
]);

CSRF令牌包含在元标签中:

<meta name="csrf-token" content="{{ csrf_token() }}">

以下是我尝试发送AJAX请求时控制台显示的内容:
XHR finished loading: GET "http://www.carsrental.me/public/me/admin/rentacar/save_availability_for_d".

如果我在结尾添加一个随机字符以寻求不存在的路由,将会发生什么:

XHR failed loading: POST "http://www.carsrental.me/public/admin/rentacar/save_availability_for_dd".

你可能想要查看API路由。将URL设置为/api/admin/rentacar/save_availability_for_d。这不是解决方案,但更加简洁。 - SuperDJ
只有在定义了API路由的情况下才会是这样,否则没有任何区别。 - ollieread
4个回答

11
这可能不是 Laravel 的问题。如果服务器配置略有偏差,我曾看到过这种情况发生。网站被设置为使用 https,而 Apache 配置被设置为将 http 端口 80 的请求重定向到端口 443。但在这个过程中,它丢失了请求方法(和 GET 参数)的跟踪。不确定这是否是您确切的问题,那是一个非此即彼的事情。但是值得一看。

非常准确,这只是一个http \ https的简单问题。 - Bobby Axe
谢谢@kmuenkel 我也遇到了类似的问题,看到你的评论后想到检查我的REST API客户端基本URL上的HTTP,问题得以解决。 感谢您的回答。 - imrealashu
帮助我和团队节省了大量的时间和精力。 - undefined

4

正如@Claymore在上面的答案中指出的那样,几乎总是由您的服务器配置和调用API/路由的方式决定。如果服务器仅允许https(端口443)请求,则任何http(端口80)POST请求都将被服务器重定向到https并作为get请求接收。

这是我的主要问题,因为我们最近安装了SSL证书,但没有更改移动应用程序中的API调用协议,导致请求失败/不需要。


我不知道为什么这个答案被踩了!可能是因为它帮我省下了整整一晚的工作时间,很好的发现,我已经在这上面花费了几个小时。服务器正在向www发布并且我有重定向。 - Raymie
有人可能没有仔细看这个答案,以至于没有注意到它实际上并不是我的重复,只是相似。我也不知道 SSL 证书会引起这种情况。所以,现在我要抵消那个负评了。(我知道报复可能是一个问题,但我仍然非常讨厌人们不解释为什么打负评,尤其是对新手来说。) - kmuenkel

2
非常有趣的效果,在这里还没有被描述过:
在我的情况下,我的URL末尾包含一个斜杠“/”。
像这样:
    $.ajax( '/my-function/', {
        type: 'POST',
        data: {
            'xxx': '{{ $yyy }}',
            '_token': '{{ csrf_token() }}'
        }
    }).done(function(data){
        console.log('DONE data: %o', data);
        if(data) {
            ...            
        }
    }).fail(function(data){
        ...;
    }).always(function(data){
        ...;
    });

通过jQuery进行了从POST到GET的重定向,让我感到困惑。

删除URL末尾的斜杠即可解决问题。

就像这样:

    $.ajax( '/my-function', {
        type: 'POST',
        data: {
            'xxx': '{{ $yyy }}',
            '_token': '{{ csrf_token() }}'
        }
    }).done(function(data){
        console.log('DONE data: %o', data);
        if(data) {
            ...            
        }
    }).fail(function(data){
        ...;
    }).always(function(data){
        ...;
    });

1
我也遇到了同样的事情!谢谢! - Carlos Castillo

1
尝试这个,还有不要忘记清除缓存
$.ajax({
      url: '{{route('save_availability_for_d')}}',
      dataType: 'json',
      type: 'POST',
      data: $(form).serialize(),
      success: function (result) {
      }
});

我忘了提到,这也会得到相同的结果:使用 GET 而不是 POST。 - Aleksandar Milivojsa

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