API:Laravel 中的 Ajax 帖子 - 403(禁止)

Posted

技术标签:

【中文标题】API:Laravel 中的 Ajax 帖子 - 403(禁止)【英文标题】:API: Ajax post in Laravel - 403 (Forbidden) 【发布时间】:2021-10-16 23:35:02 【问题描述】:

我在 ajax 调用期间收到 403 forbidden。 仅当ajaxapp.js 上时才会发生这种情况。 如果我将removeapp.js 转到index.blade.php,则工作正常。

如何让它在我的app.js 上也能正常工作? 查了很多,发现需要添加这个

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

在 ajax 之前,但仍然无法正常工作..

控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use DB;

class API extends Controller

    public function getSomething(Request $r)
    
        $r->validate([
            'user' => 'required'
        ]);

        $data = DB::table('posts')->orderBy('id', 'desc')->get();



        return $data;
    

web.php

Route::group(['prefix' => 'api'], function()
    Route::post('getSomething', 'API@getSomething');
);

index.blade.php

<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js"></script>
<meta name="csrf-token" content=" csrf_token() " />

.... some of my content ....

<script src=" asset('assets/js/app.js') "></script>

app.js

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

$.ajax(
    url: ' url("api/getSomething") ', 
    type: 'POST',
    data: 
        user: '1',
        _token: ' csrf_token() ',
        _testThisAjax: true
    ,
    success: function (c) 
        console.log(c);                                         
    ,
    error: function(e)
    
        console.log(e);
    

);

【问题讨论】:

【参考方案1】:

由于 url() 辅助方法在app.js 文件中不起作用,因此您必须在ajax 中设置url

如果你把这个放在app.js中,你的ajax应该是这样的

$.ajax(
    headers: 
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    ,
    url: '/api/getSomething', 
    type: "POST",
    data: 
             user: '1',
             _testThisAjax: true
    ,
    success: function (c) 
        console.log(c);                                         
    ,
    error: function(e)
    
       console.log(e);
    
);

注意:对于 csrf 或在这样的数据中使用 ajax 标头:

 data: _token: $('meta[name="csrf-token"]').attr('content') , 'key' : 'value'

更多信息:https://laravel.com/docs/8.x/csrf

【讨论】:

没有 URL 的第一个 / 并且工作得很好。非常感谢!顺便说一句,有没有办法在 app.js 中使用像 url() 这样的辅助方法,或者只在blade.php上工作? 它用于刀片,但你可以在 js 中定义它也可以看到:***.com/questions/30938077/…

以上是关于API:Laravel 中的 Ajax 帖子 - 403(禁止)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel ajax 帖子返回 500 内部服务器错误

ajax 类型的帖子在 laravel 5.4 中不起作用

Ajax 帖子说未定义 laravel 6

Laravel:routes/api.php 或 routes/web.php 中的 AJAX 请求端点?

即使包含 CSRF 令牌,Laravel ajax 帖子也无法正常工作

Laravel 4 ajax 发布