使用 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-compiled
、composer dump-auto
和php artisan optimize
可能会有所帮助。
这将成为客户端问题,与您的路线或 Laravel 无关。而不是type: 'post'
,请尝试method: 'post'
。我感觉这是一个 jquery 错误,因为这里有很多关于同一个问题的问题。
尝试获取 jquery 的新副本。我试图用https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js
重新创建它,我唯一能做的就是同时设置method
和type
选项,在这种情况下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 方法将数据存储在数据库中