gpt4 book ai didi

jquery - HTTP PATCH 操作在 IE 11 中失败,在 Chrome、Firefox 中有效

转载 作者:行者123 更新时间:2023-12-01 03:38:15 24 4
gpt4 key购买 nike

这是与 larger working sample 中的 PATCH 操作相关的代码片段

function restPatch(food) {
$.ajax({
url: 'https://example.azure-mobile.net/tables/food/' + food.id,
type: 'PATCH',
datatype: 'json',
beforeSend: setHeader,
data: food,
success: function (data) {
toastr.success('Edited ' + data.item);
},
error: function () { toastr.error('Operation failed! Please retry'); }
});
}

我正在使用 jQuery 2.1.0。 PATCH 操作反射(reflect)在 Firebug 和 Chrome 开发工具中的网络调用列表中,并且在 Firefox 和 Chrome 中可以正常工作,但该操作不会出现,并且在 IE 11 中的开发工具中跟踪 HTTP 调用时似乎没有发出任何请求。当我使用 POSTMAN 工具独立测试 Web 服务的 CRUD 操作时,它们都工作正常。只有编辑操作在 IE 11 桌面版和移动版上不起作用,GET、POST、DELETE HTTP 操作可以正常工作。难道我做错了什么?如何才能使 PATCH 操作在 IE 11 中正常工作?

PATCH is the officially supported way for the Azure Mobile Services-based web service更新记录。

12 月 22 日更新:当我在 IE Technical Preview remotely 上测试样本时在版本 11.0.9878.0 上,PATCH 操作有效!在 Win 8.1、IE 11.0.9600 上,PATCH 操作不起作用。

最佳答案

简单地说(看看我在那里做了什么),你不能。如果浏览器不支持 HTTP 动词,那么您实际上无法在网页上添加任何内容来使浏览器使用 HTTP 动词。

也就是说,您可以解决这个问题:

function restPatch(food) {
// Checks if IE v6-11
// See https://learn.microsoft.com/en-us/scripting/javascript/reference/at-cc-on-statement-javascript
var isIE = /*@cc_on!@*/false || !!document.documentMode;

var ajaxType = 'PATCH';
var ajaxData = food;

if(isIE) {
ajaxType = 'POST';
ajaxData._isHttpPatch = true;
}

$.ajax({
url: 'https://example.azure-mobile.net/tables/food/' + food.id,
type: ajaxType,
datatype: 'json',
beforeSend: setHeader,
data: ajaxData,
success: function (data) {
toastr.success('Edited ' + data.item);
},
error: function () { toastr.error('Operation failed! Please retry'); }
});
}

然后在服务器端,您将检查 data._isHttpPatch 是否设置为 true,如果是,则将其视为 PATCH 请求。

当然,这取决于您是否有请求类型重载 - 即,如果您有一个 REST 服务,该服务有两种用于/tables/food/{id} 的方法,一种在 POST 上操作,一种在 PATCH 上操作,并且您需要为此编写修复程序,那么您可能会认为始终在客户端上设置此标志会更容易。

这实际上是许多框架所做的事情。如果以 Laravel 为例,它会添加一个隐藏的 HTML 输入:

<input type="hidden" name="method" value="_patch" />

唯一需要记住的另一件事是,HTTP PATCH 不应该只接受一个对象,例如仅设置更新的属性。它应该采用一个描述差异的对象(想想 Git diff),或者一个 JSON 合并补丁消息(其内容类型为“application/merge-patch+json”);请参阅http://williamdurand.fr/2014/02/14/please-do-not-patch-like-an-idiot/ 。这意味着您可以将它们全部作为 POST,然后使用 Content-Type header 或补丁描述中的其他一些唯一标识符来确定它确实是补丁而不是替代品。

遗憾的是,否则,您就需要等待用户计算机上的 IE11 等更新。嗬哼!

关于jquery - HTTP PATCH 操作在 IE 11 中失败,在 Chrome、Firefox 中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27572125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com