当 PUT 通过 AJAX 用于 Laravel 资源时,方法不允许

Posted

技术标签:

【中文标题】当 PUT 通过 AJAX 用于 Laravel 资源时,方法不允许【英文标题】:Method not allowed when PUT used over AJAX for Laravel resource 【发布时间】:2015-10-16 08:19:18 【问题描述】:

我在 routes.php 中有这个资源:

Route::resource('items', 'ItemsController', ['before' => 'admin_access']);

试图通过 AJAX 访问 ItemsContoller@update 方法,但它会抛出 405 Method not allowed 错误:

var $inputs = $('input', row);

var id = $(row).find('.edit').data('id');

var data = $inputs.serializeJSON();

data['_token'] = $('input[name=_token]').val();
data['_method'] = 'PUT';

console.debug(data);

$.ajax(
    url: 'items/' + id,
    method: 'PUT',
    dataType: 'json',
    data: data,
    complete: function (data) 
        if (data.success) 
            itemsTable.ajax.reload();
        
    
);

iddata 变量都包含正确的信息。

当我使用 PUT 作为方法(使用anahkiasen/Former opener 方法)进行标准表单提交时,这很好用。

我在这里错过了什么?

【问题讨论】:

从错误消息(似乎来自服务器)和我读过的关于 Laravel 的少量信息来看,这似乎是您的 PUT 请求 URL 和您的路由处理程序不是对齐,因此 Laravel 没有找到该组合的处理程序,因此返回 405。 【参考方案1】:

大多数浏览器无法发送 PUT 方法,并且仅限于 GET 和 POST。

尝试将方法更改为 POST,但将 _method 元素保留在 data 数组中以欺骗请求方法。

【讨论】:

呃,我完全忘记了这个限制。就是这样。谢谢! 我是这么想的。当我将method: 'PUT' 更改为method: 'POST' 时,它可以工作,但没有得到预期的JSON 响应,所以我添加了contentType: 'application/json',现在我又回到了405 错误。有什么想法吗? 通过将'?_method=PUT' 附加到url 值的末尾来解决此问题。在我将 contentType 更改为 json 后,Laravel 没有检测到。 你为什么认为“大多数浏览器不能发送 PUT 方法”?我刚刚在 Chrome、Firefox 和 IE 11 的当前版本中尝试了一个 PUT 请求,它们都对我自己的服务器运行良好。 jQuery 和 MDN 都清楚地记录了支持 PUT 请求。 @jfriend00 对不起。代表我措辞不佳;同样来自 MDN 文档 (developer.mozilla.org/en-US/docs/Web/…):“html 规范只允许使用 GET 和 POST 方法。”这些天,一些浏览器可能能够发送 PUT 请求,但它在 HTML 规范中无效。 AJAX 似乎很好,但同样,并非每个浏览器都支持 PUT。 Chrome、Firefox 和 IE 可能,但旧版浏览器、移动和平板设备上的浏览器、电子阅读器等呢?

以上是关于当 PUT 通过 AJAX 用于 Laravel 资源时,方法不允许的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 6 中使用 PUT 方法 AJAX 会导致空的 $request->all() 数组

Laravel 5.8 文件上传使用 PUT 方法和 ajax

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

laravel vuejs/axios put request Formdata 为空

当通过Ajax进行POST时,Laravel 5.6 CSRF令牌失败

file_put_contents 不适用于 json laravel 和 php