使用 Laravel 将 jQuery Ajax POST 请求作为 GET 发送

Posted

技术标签:

【中文标题】使用 Laravel 将 jQuery Ajax POST 请求作为 GET 发送【英文标题】:jQuery Ajax POST request being sent as GET with Laravel 【发布时间】:2015-07-17 00:37:15 【问题描述】:

我在使用 Ajax 时遇到了一些问题。我的项目在Laravel 5 中,它在Apache 上运行,rewrite 已启用,VerifyCsrfToken 中间件已就位。我正在尝试将 POST 请求发送到我项目中的另一条路线。这是我的 Ajax 的样子:

$.ajax(
    url: '/add-device/',
    type: 'POST',
    data: form_data,
    success: function(data)
    
        console.log(data);
    ,
        error: function(data)
    
        console.log(data);
    
);

当我单击触发此 Ajax 的按钮时,我会收到 405: MethodNotAllowed 响应。所以我进入 routes.php 并添加了一条 GET 路由。我还包括了我的 POST 路线:

Route::get('add-device', function()

    return 'hello';
);

Route::post('add-device', [
    'middleware' => 'auth',
    'uses' => 'FormController@add_device'
]);

我收到“你好”消息,所以这是作为 GET 而不是 POST 发送的。我尝试使用$.post 而不是$.ajax 来强制POST,但我仍然得到相同的行为。为了更好的衡量,这是我的.htaccess 文件:

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ index.php [L]
</IfModule>

由于重写规则 (/add-device),我还尝试了不带斜杠的 Ajax,但我得到了相同的“你好”消息。

我在开发过程中测试了我所有的 Ajax 请求(一半是 GET,一半是 POST),它们在使用 artisan 服务时运行良好。我只是在切换到Apache 后才出现这个问题。我已进入项目的 QA 阶段,因此我将项目移至我们的开发服务器上,该服务器在 Debian 8 上运行 Apache 2.4.10

有人对正在发生的事情以及如何解决它有任何想法吗?


附加内容

Exception trace:
 () at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:901
 Illuminate\Foundation\Application->abort() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:21
 abort() at /home/debian/public_html/ZipPrinter/app/Handlers/Events/AbortTheRequest.php:28
 App\Handlers\Events\AbortTheRequest->handle() at n/a:n/a
 call_user_func_array() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php:327
 Illuminate\Events\Dispatcher->Illuminate\Events\closure() at n/a:n/a
 call_user_func_array() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php:218
 Illuminate\Events\Dispatcher->fire() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:650
 event() at /home/debian/public_html/ZipPrinter/app/Services/ZipHelper.php:56
 App\Services\ZipHelper->__construct() at /home/debian/public_html/ZipPrinter/app/Services/DashHelper.php:43
 App\Services\DashHelper->__construct() at /home/debian/public_html/ZipPrinter/app/Http/Controllers/DashController.php:28
 App\Http\Controllers\DashController->__construct() at n/a:n/a
 ReflectionClass->newInstanceArgs() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Container/Container.php:817
 Illuminate\Container\Container->build() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Container/Container.php:656
 Illuminate\Container\Container->make() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:644
 Illuminate\Foundation\Application->make() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Foundation/Console/RouteListCommand.php:161
 Illuminate\Foundation\Console\RouteListCommand->getControllerMiddleware() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Foundation/Console/RouteListCommand.php:142
 Illuminate\Foundation\Console\RouteListCommand->getMiddleware() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Foundation/Console/RouteListCommand.php:109
 Illuminate\Foundation\Console\RouteListCommand->getRouteInformation() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Foundation/Console/RouteListCommand.php:89
 Illuminate\Foundation\Console\RouteListCommand->getRoutes() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Foundation/Console/RouteListCommand.php:75
 Illuminate\Foundation\Console\RouteListCommand->fire() at n/a:n/a
 call_user_func_array() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Container/Container.php:523
 Illuminate\Container\Container->call() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Console/Command.php:115
 Illuminate\Console\Command->execute() at /home/debian/public_html/ZipPrinter/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:257
 Symfony\Component\Console\Command\Command->run() at /home/debian/public_html/ZipPrinter/vendor/laravel/framework/src/Illuminate/Console/Command.php:101
 Illuminate\Console\Command->run() at /home/debian/public_html/ZipPrinter/vendor/symfony/console/Symfony/Component/Console/Application.php:874

【问题讨论】:

你的路由缓存了吗?尝试运行php artisan route:clear 以确保您没有处理一些旧缓存。另外,请确保该路线确实是在php artisan route:list 注册的。此外,强制性的php artisan clear-compiledcomposer dump-autophp artisan optimize 可能会有所帮助。 这将成为客户端问题,与您的路线或 Laravel 无关。而不是type: 'post',请尝试method: 'post'。我感觉这是一个 jquery 错误,因为这里有很多关于同一个问题的问题。 尝试获取 jquery 的新副本。我试图用https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js 重新创建它,我唯一能做的就是同时设置methodtype 选项,在这种情况下method 总是覆盖type 我得到的唯一错误是 405。我的 javascript 的其余部分工作得很好。 我实际上能够重现该行为:url: '/add-device/' 中的斜杠似乎至关重要。当我省略它时,它会忽略 ajax 设置并发出 GET 请求,如果我把它留在那里,它会正确发出 POST 请求。我不太确定为什么会这样,似乎是一些 HTTP 特定的东西。然而,使用 Jquery 2.1,POST 可以同时使用两者,但是我得到一个带有斜杠的 url 的 301 响应——这实际上是 .htaccess 中定义的预期行为。但它仍然会先发出 POST 请求。所以,如果可能的话,也许你应该升级你的 Jquery 版本。 【参考方案1】:

所以我删除了尾部的斜杠,它突然起作用了。我不确定为什么会这样,但确实如此。我也将此问题发布到Laracasts。我建议那些与我遇到相同问题的人通读 cmets 和其他线程,以便他们可以按照我的步骤进行操作。我认为我之前的步骤之一解决了一个问题,因此当我这次删除尾部斜杠时,它起作用了。感谢大家的帮助!

【讨论】:

【参考方案2】:

从对我有用的 ajax 请求 url 中删除了尾部斜杠

【讨论】:

【参考方案3】:

为你的发帖路线试试这个

Route::post('add-device', [
    'as' => 'add_device.post'
    'middleware' => 'auth',
    'uses' => 'FormController@add_device'
]);

【讨论】:

我试过了,但我仍然得到 405 MethodNotAllowed。 你能发布你的路由文件和失败请求的控制台截图吗?

以上是关于使用 Laravel 将 jQuery Ajax POST 请求作为 GET 发送的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 laravel 通过 jquery ajax 将表单值插入数据库?

jquery ajax 传递 2 个数组,然后将它们拆分并在 laravel 中分别使用

Laravel 5.2 无法将跨域 jQuery 方法识别为 AJAX

使用 Laravel 4+ 从 jQuery/ajax 保存序列化的可排序数据

在 Laravel 5.2 中通过 RESTful 资源控制器使用 jQuery Ajax Post 方法将数据存储在数据库中

如何在 Laravel 中使用 jQuery ajax 请求自动添加 X-CSRF-TOKEN