ServiceStack DELETE请求是默认对象,POST工作正常
本文关键字:POST 工作 对象 DELETE 请求 默认 ServiceStack | 更新日期: 2023-09-27 17:58:19
我有一个来自Javascript客户端的DTO。当我尝试用deleteFromService
发送时,请求对象是空的(看起来它只是新的)。如果我将方法更改为postToService
,则会正确填充请求对象。
我正在使用3.9 API。我在这里不知所措。
服务:
public object Post(Order request)
{
return _orderRepository.InsertOrder(request);
}
public object Delete(Order request)
{
_orderRepository.DeleteOrder(request.Uuid);
return true;
}
JS:
//Fails
serviceClient.deleteFromService("order", order, function () { }, deleteFailed);
//Works
serviceClient.postToService("order", order, function () { }, deleteFailed);
更新:
我在ServiceStack源代码中发现了这个问题。它像对待GET一样对待DELETE,并创建请求对象而不是正文,就像对待POST一样。
if (httpMethod == HttpMethods.Get || httpMethod == HttpMethods.Delete || httpMethod == HttpMethods.Options)
{
try
{
return KeyValueDataContractDeserializer.Instance.Parse(queryString, operationType);
}
}
这样做的问题是,ServiceStack JS客户端使用与POST相同的逻辑创建DELETE请求,方法是将发送的数据填充到主体中(技术上是jQuery XHR data
道具),这意味着服务器无法获得客户端正在发送的消息。
我读对了吗?JS客户端的删除被破坏了吗?
在选项var初始化之前,我重写了servicestack.js
客户端,在P.Send
函数中添加了以下行。。。
if (ajaxOptions.type === "DELETE") {
requestUrl = requestUrl + "?" + decodeURIComponent($.param(request[webMethod]));
}
DELETE
消息不应携带消息正文,这意味着您只能在url中向DELETE请求传递参数(例如,您要删除的对象的ID)。因此,除了ServiceStack所做的之外,您永远不应该在DELETE请求中发送DTO。
请参阅此相关问题:HTTP DELETE请求是否允许实体体?