具有分页,排序和筛选的WebAPI Get方法

问题描述 投票:0回答:1

我正在创建一个WebAPI,在该WebAPI中,get方法需要接受用于分页,排序和筛选的参数。由于排序和过滤可以是键的列表-值对和过滤也具有运算符(gt,lt,equals,contains ...),并且我们知道不建议在主体中使用get方法发送对象,这是怎么回事API处理的场景?

c# rest asp.net-web-api get parameter-passing
1个回答
0
投票

仅将它们作为Query String传递。对于分页,排序和过滤之类的行为,这是最佳做法,因为它可以由用户添加书签并重用。

[您可以在许多著名的网站上看到您的答案,例如在SO中,请看下面的过滤器参数:

https://stackoverflow.com/questions?sort=Newest&filters=NoAnswers,NoAcceptedAnswer,Bounty


@ AdrianoRepetti在评论中有很多有益的补充,我在得到允许的情况下予以回答:

有几种不同的方法:

例如,用于排序:

http://www.example.com/api/orders?sort=field1,field2

http://www.example.com/api/order?sort=field1&sort=field2

现在让我们做得更好:您还需要排序顺序,可以很好地表示为:

http://www.example.com/api/orders?sort=created_at+asc,delivered_at+desc

过滤器可能更加复杂。一个简单的场景:

http://www.example.com/api/order?filter=status%3dpending(请注意%3d要转义=,API将在过滤器参数中看到status=pending)。您是否需要更多ANDed过滤器?只需串联或重复它们即可(例如进行排序)。如果支持其他运算符,则可以使用其他字符代替%3d。如果事情变得更加复杂,那么您将需要自己的迷你语言来表示您的过滤器(切记对客户端的URI组件进行编码!!!)

或早或晚,您需要使查询更加复杂,然后又太长而无法容纳查询字符串(例如,当您需要IN运算符时)。对于此类查询,使用POST而不是GET是完全可以接受的(并且被广泛使用)(例如,请参见OpenData)。您可以为过滤器提出一些更复杂的方案,但是简单的JSON对象(或下摆GraphQL)通常是更好,更轻松的选择

© www.soinside.com 2019 - 2024. All rights reserved.