7

我有一个来自 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 源代码中发现了这个问题。它将 DELETE 视为 GET 并创建请求对象而不是正文,就像它为 POST 所做的那样。

if (httpMethod == HttpMethods.Get || httpMethod == HttpMethods.Delete || httpMethod == HttpMethods.Options)
{
    try
    {
        return KeyValueDataContractDeserializer.Instance.Parse(queryString, operationType);
    }
}

这样做的问题在于,ServiceStack JS 客户端使用与 POST 相同的逻辑创建 DELETE 请求,通过将您发送的数据填充到正文中(技术上是 jQuery XHRdata属性),这意味着服务器没有办法获取客户端发送的消息。

我读对了吗?JS客户端的delete坏了吗?

4

2 回答 2

2

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

if (ajaxOptions.type === "DELETE") {
    requestUrl = requestUrl + "?" + decodeURIComponent($.param(request[webMethod]));
}
于 2013-07-31T15:11:56.093 回答
1

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

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

于 2013-06-01T14:24:31.480 回答