向web api控制器发送多个查询

时间:2013-09-28 16:19:07

标签: rest asp.net-web-api

webapi(除了odata)有没有办法指定多个查询? 这是场景: 一个自定义的sproc。接受2个邮政编码,执行距离计算并返回距离 WebAPI端点接受拉链并调用sproc。并返回距离DTO 类ZIPDistance {   公共字符串Zip1,   公共字符串Zip2,   public sttring Distance }

此URL:“/ api / ZipDistances?$ select = Distance& $ filter = Zip1 eq 13240 and Zip2 eq 90210 在ZipDistancesController中,我们使用ODataQueryOptions从上面的查询中提取参数,调用sproc。 并返回上面的DTO。

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

我所知道的唯一方法是通过POST并传递代表邮政编码对的ZIPDistance集合。 有效负载,但这基本上是针对REST的,因为现在我们将POST的语义改为意味着数据检索(即GET)

问题是WEBAPI是否支持上述场景,以及在没有重载的情况下实现上述内容的最佳方法 动词意义并引起混淆。

更新:

我已经制定了一个可能的解决方案here,其中包括将这些对嵌入到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): 我发布了另一个使用查询资源的原型here

1 个答案:

答案 0 :(得分:1)

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

然而,
另一种可能的RESTfull方法是使用POST创建“查询资源”对象,返回“查询资源ID号”,稍后将在分离的GET请求中使用。

通过这种方式,您可以创建已保存的查询,这些查询也可以有效地进行重新查询。