1

webapi(除了odata)有没有办法指定多个查询?这是场景:自定义存储过程。接受 2 个邮政编码,执行距离计算并返回距离 WebAPI 端点接受 zip 并调用 sproc。并返回一个距离 DTO 类 ZIPDistance { public string Zip1, public string Zip2, public string Distance }

此 URL:"/api/ZipDistances?$select=Distance&$filter=Zip1 eq 13240 和 Zip2 eq 90210 在 ZipDistancesController 中,我们使用 ODataQueryOptions 从上述查询中提取参数,调用存储过程并返回上述 DTO。

出于潜在的性能原因,要求上述端点以某种方式接受邮政编码对的集合,即代表我们需要调用上述存储过程的邮政“对”的“ZIPDistance”DTO 集合,循环遍历 DTO ,调用存储过程。每个 DTO 并返回结果的 DTO 集合,以便客户端进行单个 HTTP 调用而不是多次调用,并在 1 个调用中获取所有结果。

我知道的唯一方法是通过 POST 并传入代表有效负载中邮政编码对的 ZIPDistances 集合,但这从根本上反对 REST,因为现在我们将 POST 的语义含义更改为数据检索(即得到)

问题是 WEBAPI 是否支持上述场景,以及在不重载动词含义和引起混淆的情况下实现上述场景的最佳方式是什么。

更新:

我在这里原型化了一种可能的解决方案,其中包括将这些对嵌入到 URL 中:

http://<host>/api/ZipDistances?$select=Distance&$filter=Pairs eq 'Zip1 eq 13240 and Zip2 eq 90210,Zip1 eq 13241 and Zip2 eq 90211'

和相应的 DTO:

 public class ZipDistanceDTO
    {
        public string ZipPairs { get; set; }
        public string Distance { get; set; }
    }

这将返回以下结果:

[{"ZipPairs":"'Zip1 eq 13240 and Zip2 eq 90210","Distance":"558"},
{"ZipPairs":"Zip1 eq 13241 and Zip2 eq 90211'","Distance":"558"}]

对此的评论/想法将不胜感激。

更新(2):我在这里发布了另一个使用查询资源的原型

4

1 回答 1

1

使用多个邮政编码发出正确的 GET 请求就可以使用。

但是,
另一种可能的 RESTfull 方式是使用 POST 创建一个“查询资源”对象,返回“查询资源 ID 号”,稍后将在单独的 GET 请求中使用该对象。

这样您就可以创建已保存的查询,这对于重新查询也很有效。

于 2013-09-29T23:11:16.430 回答