如何在 ASP Core 中实现复杂的 Web API 查询

how to implement Complex Web API queries in ASP Core

提问人:Sepidehye Fanavari 提问时间:7/26/2016 最后编辑:Sepidehye Fanavari 更新时间:7/27/2016 访问量:999

问:

我是 Web API 设计的新手,因此我尝试使用以下文章来学习 Web API 设计的最佳实践:

1.Microsoft REST API 指南

2.Web API 设计-开发者喜欢的“Apigee”界面

Apigee 建议 Web API 开发人员使用这些建议来获得更好的 API。 我在这里引用其中的两条建议: 我需要 C# 代码在我的 Web API(在 ASP Core 中)中实现这些建议,Web API 是本机移动应用程序和 AngularJs 网站的后端。

  1. 扫除“? 大多数 API 的复杂性超出了资源的基本级别。复杂性可能包括许多可以更新、更改、查询的状态,以及与 资源。

通过在 HTTP 问号后面放置可选状态和属性,使开发人员能够轻松使用基 URL。为了让所有红狗在公园里奔跑:

GET /dogs?color=red&state=running&location=park

  1. 部分响应允许您为开发人员提供他们需要的信息。

例如,在 Twitter API 上请求推文。你会得到比典型的 Twitter 应用程序通常需要的更多的东西——包括人名、推文文本、时间戳、消息转发的频率以及大量元数据。

让我们看看几个领先的 API 如何处理为开发人员提供他们需要的东西 回应,包括率先提出部分回应想法的谷歌。

LinkedIn

/people:(id,first-name,last-name,industry)

对一个人的此请求将返回 ID、名字、姓氏和行业。

LinkedIn使用这个简洁的:(进行部分选择...语法,这是不言而喻的。

此外,开发人员很难使用搜索引擎对含义进行逆向工程。

脸书

/joe.smith/friends?fields=id,name,picture

谷歌

?fields=title,media:group(media:thumbnail)

谷歌和Facebook也有类似的方法,效果很好。

它们每个都有一个名为 fields 的可选参数,您可以在该参数后面输入要返回的字段的名称。

如本示例所示,您还可以将子对象放在响应中,以便从其他资源中提取其他信息。

在逗号分隔列表中添加可选字段

谷歌的方法非常有效。

以下是使用这种方法从我们的狗 API 中获取我们需要的信息的方法:

/dogs?fields=name,color,location

现在我需要 C# 代码来处理这些类型的查询,甚至更复杂的查询,如下所示:

api/books/?publisher=Jat&Writer=tom&location=LA?fields=title,ISBN?$orderBy=location desc,writerlimit=25&offset=50

因此,Web API 用户将能够发送他们想要的任何类型的请求,这些请求具有不同的复杂性、字段和排序,...根据他们的需求。

ASP.NET-WEB-API2 ASP.NET-MVC-ROUTING URL-ROUTING

评论

0赞 NightOwl888 7/26/2016
不清楚你在问什么。请注意,路由根本不使用查询字符串,除非您对其进行自定义以执行此操作。路由考虑路径(例如)来获取匹配项。只有在匹配路由后才会考虑查询字符串数据,但查询字符串数据由值提供程序(而不是路由)传递到操作方法中。/foo/bar
0赞 Paresh 7/27/2016
可以使用 OData V4 实现此 asp.net/web-api/overview/odata-support-in-aspnet-web-api/...
0赞 Sepidehye Fanavari 7/27/2016
@ NightOwl888我更改了帖子以解释我的意思。谢谢
0赞 Sepidehye Fanavari 7/27/2016
@Paresh 2.我是 Web API 设计的新手。我的项目非常大,我正在寻找最佳实践。使用 OData 是否比手动实现查询处理更好?2. 我认为您建议我使用常规 Web API,当我需要处理查询字符串时,请使用 Odata。3.不幸的是,当我尝试添加“Microsoft.AspNet.Odata”(v 5.9.1)块包时,我收到此错误“与netcoreapp1.0(.NETCoreApp,Version=v1.0)“我还尝试添加包”Microsoft.AspNet.WebApi.Odata“,但我遇到了同样的错误。
0赞 Paresh 7/28/2016
@SepidehyeFanavari 1.这取决于您的情况,如果您有复杂的领域模型,那么它可能不是您的最佳解决方案。2. 不,我建议将 OData 用于所有控制器,但同样这取决于您的项目复杂性。3. 您需要将 OData 6.0.0 alpha 包用于 ASP 核心。以下是一些有用的链接 odata.github.io/WebApi/#07-07-6-0-0-alpha1 myget.org/gallery/odatavnext github.com/OData/WebApi/tree/v6.0.0-alpha1/vNext/samples/...

答: 暂无答案