laravel 5中的ajax post返回错误500(内部服务器错误)
这是我在laravel 5中的测试ajax(参见下文)
$("#try").click(function(){ var url = $(this).attr("data-link"); $.ajax({ url: "test", type:"POST", data: { testdata : 'testdatacontent' }, success:function(data){ alert(data); },error:function(){ alert("error!!!!"); } }); //end of ajax });
和触发链接
Try
和我的路线
Route::post('test', function() { return 'Success! ajax in laravel 5'; });
但是当我在谷歌浏览器中运行控制台并且它没有返回预期的响应“返回’成功!在laravel 5中的ajax’时,它给了我错误;”
POST http://juliver.laravel.com/test 500(内部服务器错误)
什么错误/我的代码有问题? 什么我失踪了?
虽然这个问题存在了一段时间,但没有给出可接受的答案,我想指出你的解决方案。 因为您使用ajax发送,并且可能仍然使用CSRF中间件,所以您需要为您的请求提供额外的标头。
为每个页面(或主布局)添加元标记:
并添加到您的javascript文件(或页面中的部分):
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });
有关详细信息,请参阅https://laravel.com/docs/master/csrf#csrf-x-csrf-token 。
laravel ajax内部服务器错误的90%是由于缺少CSRF令牌。 其他原因可以包括:
- 错误的请求类型(例如发送post以获取)
- 收到了错误的数据类型(例如,ajax期待JSON和app返回字符串)
- 您的.htaccess配置错误
- 缺少路线
- 代码错误
您可以在此处详细了解详情: https : //abbasharoon.me/how-to-fix-laravel-ajax-500-internal-server-error/
我想现在已经解决了这个问题,但这里最好的办法就是用你的表单发送令牌
{!! csrf_field() !!}
然后在你的ajax
$("#try").click(function(){ var url = $(this).attr("data-link"); $.ajax({ url: "test", type:"POST", data: { '_token': token, 'someOtherData': someOtherData }, success:function(data){ alert(data); },error:function(){ alert("error!!!!"); } }); //end of ajax });
在App \ Http \ Middleware \ VerifyCsrfToken.php中,您可以尝试将文件更新为:
class VerifyCsrfToken extends BaseVerifier { private $openRoutes = [ ...excluded routes ]; public function handle($request, Closure $next) { foreach($this->openRoutes as $route) { if ($request->is($route)) { return $next($request); } } return parent::handle($request, $next); } };
这允许您明确绕过您不想validation的特定路由,而不会全局禁用csrfvalidation。
您可以将您的URL添加到VerifyCsrfToken.php中间件。 这些URL将从CSRFvalidation中排除。
protected $except = [ "your url", "your url/abc" ];
默认情况下,Laravel附带CSRF中间件。
你有2个选择:
- 在您的请求中发送令牌
- 禁用CSRF中间件(不推荐):在app \ Http \ Kernel.php中从$ middleware数组中删除VerifyCsrfToken
对我来说这个错误导致了不同的东西。 我的页面中有两个ajax调用。 第一个用于保存注释,另一个用于保存。 在我的routes.php我有这个:
Route::post('posts/show','PostController@save_comment'); Route::post('posts/show','PostController@save_like');
我得到500内部服务器错误为我的保存像ajax调用。 所以我将第二行http请求类型更改为PUT,错误消失。 你也可以使用PATCH。 也许有帮助。
使用post jquery代替我帮助我解决了这个问题
$.post('url', data, function(response) { console.log(response); });
你必须通过ajax传递csrf字段,请在这里查看代码
$.ajax({ type: "POST", url:'{{URL::to("/delete-specialist")}}', data: { id: id, _token: $('#signup-token').val() }, datatype: 'html', success: function (response) { if(response=="deleted"){ $("#"+id).hide(); $("#message").html("successfully deleted"); } } });
并且您还需要在此之前编写此输入字段
如果您不明白,请欣赏此videohttps://www.youtube.com/watch?v=ykXL8o0slJA&t=20s