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客户端的删除被破坏了吗?

ServiceStack DELETE请求是默认对象,POST工作正常

在选项var初始化之前,我重写了servicestack.js客户端,在P.Send函数中添加了以下行。。。

if (ajaxOptions.type === "DELETE") {
    requestUrl = requestUrl + "?" + decodeURIComponent($.param(request[webMethod]));
}

DELETE消息不应携带消息正文,这意味着您只能在url中向DELETE请求传递参数(例如,您要删除的对象的ID)。因此,除了ServiceStack所做的之外,您永远不应该在DELETE请求中发送DTO。

请参阅此相关问题:HTTP DELETE请求是否允许实体体?