【问题标题】:ServiceStack DELETE request is default object, POST works fineServiceStack DELETE 请求是默认对象,POST 工作正常
【发布时间】:2013-02-07 22:24:21
【问题描述】:

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

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

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

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

【问题讨论】:

  • ServiceStack 服务器和 ServiceStack JS 客户端之间显然存在根本性的脱节。 JS 客户端认为 DELETE 信息应该在请求负载中,但服务器认为它应该在查询字符串中。在我看来,JS客户端是错误的。
  • 看起来像是 JS 客户端中的一个错误...打开一个问题 IMO github.com/ServiceStack/ServiceStack/issues?state=open

标签: c# servicestack


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    查看这个相关问题:Is an entity body allowed for an HTTP DELETE request?

    【讨论】:

    • 您链接到的问题并没有说明您在说什么。
    • 不仅阅读标记为有效的答案,还阅读其他答案。 HTTP 规范在这一点上似乎是模棱两可的,但是当提供 DELETE 请求时,相当多的实现只是忽略了请求实体(=body)。标记为已接受的问题还表示 Microsoft 忽略了其 ADO.NET 实现的请求实体。您描述的错误与此行为匹配:请求 DTO 可能带有默认值,因为消息正文(JSON、XML 或其他)被忽略。
    • 我明白这一点,但我不明白它与我的观点有何关系。显然消息正文被忽略了,我说的也是我自己的问题。您没有添加新信息。我的观点是 ServiceStack 的服务器和客户端在做什么上存在分歧。这与 Microsoft、ADO 或 HTTP 规范有什么关系?
    • 我指的不是你的“观点”,而是回答你的问题——这是一个问答网站。如上所述,据我所知,您的问题询问为什么请求对象为空。答案是:它是空的,因为服务器选择忽略消息正文(其中包含填充 DTO 所需的 JSON)。如果我误解了您的 exakt 问题,请改写(并记住问题以 ? 结尾)。
    • 我确实以“?”结束了它,这是我问题中的最后一句话:是 JS 客户端坏了,还是我读错了代码。您的回答没有解决这个问题,或者一般的 ServiceStack。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2021-04-10
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多