Laravel:通过无表单的 AJAX 向控制器发送数据

Posted

技术标签:

【中文标题】Laravel:通过无表单的 AJAX 向控制器发送数据【英文标题】:Laravel: Send Data to Controller via AJAX Without Form 【发布时间】:2017-08-30 01:44:51 【问题描述】:

我需要在单击按钮时通过 JS 将数据发送到 Laravel 控制器。我没有使用任何形式,因为数据是动态创建的。 每次我尝试发送数据时,都会收到内部服务器错误 (500),但无法在控制器或 laravel.log 文件中捕获该异常。

这就是我正在做的事情:

路线:

Route::post('section/saveContactItems', 'SectionController@saveContactItems');

控制器:

public function saveContactItems($id, $type, $items, $languageID = "PT") ... 

JS:

$('button').on("click", function (evt) 

    evt.preventDefault();

    var items = [];
    var id = $("#id").val();
    var languageID = $("#languageID").val();
    var data =  id: id, type: type, items: JSON.stringify(items), languageID: languageID ;

    $.ajax(
        url: "/section/saveContactItems",
        type: "POST",
        data: data,
        cache: false,
        contentType: 'application/json; charset=utf-8',
        processData: false,
        success: function (response)
        
            console.log(response);
        
    );
);

我做错了什么?我怎样才能做到这一点?

更新:感谢@ShaktiPhartiyal 的answer(和@Sanchit 的帮助)我能够解决我的问题。如果其他人遇到类似问题,在遵循@Shakti 的回答后,我无法访问控制器中的数据。因此,我必须在将数据发送到服务器之前对其进行字符串化:

data: JSON.stringify(data),

【问题讨论】:

当你使用 POST 时,你必须通过 csrf_token 字段... @sanchitGupta 我试过了,但也没有成功...... 好的...让我们试试下面的@ShaktiPhartiyal 回答...如果它有效,请告诉我 【参考方案1】:

你不需要使用

public function saveContactItems($id, $type, $items, $languageID = "PT") ... 

您必须执行以下操作:

public function saveContactItems()

    $id = Input::get('id');
    $type = Input::get('type');
    $items = Input::get('items');
    $languageID = Input::get('languageID');

是的,正如@Sanchit Gupta 建议的那样,您需要在请求中发送 CSRF 令牌:

AJAX 发送 CSRF 令牌的方法:

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

如果你使用这种方法,你需要像这样设置一个元标记:

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

data: 
        "_token": " csrf_token() ",
        "id": id
        

更新

正如@Sanchit Gupta 指出的那样使用 Input 门面:

use Input;

【讨论】:

我终于可以访问控制器操作 :) 现在我收到以下错误:异常 'Symfony\Component\Debug\Exception\FatalErrorException' 带有消息 'Class 'App\Http\Controllers\Input'成立'。这是由 $id = Input::get('id'); 在控制器顶部使用 Input 外观 解决了错误,但是出来的数据是空的。这是我发送给控制器的内容:对象 id:“5”,类型:“电子邮件”,项目:“[]”,语言 ID:“PT” 它的工作!只需要在将数据发送到控制器之前对其进行字符串化: JSON.stringify(data); 很好解释@ShaktiPhartiyal +1。快乐编码:)

以上是关于Laravel:通过无表单的 AJAX 向控制器发送数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel,尝试通过 AJAX 向控制器传递数据时出现不匹配的令牌错误

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

使用 Laravel 和 Select2 向 HTTP 提供 HTTPS 的 jQuery AJAX 请求

当通过 Ajax 将数据发送到 Laravel 中的控制器时,数据为空

如何使用 ajax 在 laravel 5 中发布表单?

laravel 控制器不接收来自 AJAX 的数据