REST API设计:对API的多次调用与单次调用


19

我们正在开发用于电子商务网站的Rest API,它将由移动应用程序使用。

在应用程序的首页中,我们需要调用多个资源,例如滑块,顶级品牌,畅销产品,热门产品等。

进行API调用的两个选项:

单次通话:

www.example.com/api/GetAllInHome

多个通话:

www.example.com/api/GetSliders

www.example.com/api/GetTopBrands

www.example.com/api/GetBestSellingProducts

www.example.com/api/GetTrendingProducts

其余api设计的最佳方法是哪种-一次或多次调用,说明优缺点?

哪个会花更多时间来响应请求?

Answers:


14

理论上讲,多个同时进行的呼叫更加灵活并且速度也很快。

但是,实际上,如果先加载页面,然后加载该页面的每个部分,则在整个页面上显示加载微调框,直到获得结果为止,结果缓慢且不连贯。

因此,仅当页面的某个部分加载速度较慢或需要以与页面其余部分不同的周期刷新时,才应谨慎使用AJAX数据请求。说一个母版/详细信息显示,您要在其中从母版中选择一个选项并显示相应的详细信息,而无需重新加载母版。

常见的设计是保留单独的API,以解决编码灵活性和微服务问题,但将网站中的数据服务器端合并在一起。这样客户就只需要对自己的网站进行一次呼叫。具有适当缓存的API调用应在数据中心内快速传输。

另外,请考虑完全不进行任何客户端API调用。只需生成HTML服务器端。尽管javascript单页应用程序框架将您推向api路线。对于大量的电子商务站点,通常不是最佳方法。

在此处输入图片说明


谢谢,实际上此api已在android和i手机应用程序中使用,我想知道何时加载应用程序主页,是否应获取所有资源,例如:单个API调用中的滑块,品牌,产品,或在单个API调用单个API时用户向下滚动?
shaijut

应用相同的逻辑,在不需要的地方最小化同时调用。但是,应用程序为您提供了更多灵活性,可以在后台下载信息。您可能想切换到GetChangesSInce(date)方法
Ewan

因此,您可以得出结论,最好是在应用程序的主页加载后,立即使用单个API来一次调用所有主页资源响应,而当您要更新页面的一部分时,最好分别为微型服务使用不同的api,滑块等品牌api ?
shaijut

除非您有充分的理由说明为什么这些部分不只是加载页面/主数据,否则不
Ewan

我最后一个问题是,亚马逊,flipkart之类的应用程序如何工作?当用户打开应用程序时,它们是否在一次调用时加载所有主页资源?我想知道什么是最好的方法。
shaijut

5

TL; DR:除了所有其他应用程序注意事项之外,执行单个调用比执行多个调用要快。从用户的角度来看,异步运行呼叫可能会减少完成给定操作所需的总时间(这很可能就是您所需要的全部时间),但总的来说,多次调用所花费的时间仍然会更长。

但是,就您的情况而言,我不确定是不是全部。

REST API是一个略带歧义的术语,这是由于对该论文进行了各种解释,使该想法很流行。即使对构成REST API的内容进行最宽松的解释,您所拥有的也不是很合适。

核心原则是您拥有要在其上执行操作的资源。URI标识您感兴趣的资源,通常您会使用HTTP动词来指示您要对该资源执行的操作。

在您的特定情况下,所有方法的名称中都带有单词“ get”。您应该更改HTTP请求中使用的动词,以指示您要“获取”该位置的可用资源。

您的URI方案应代表您想向API用户提供的资源的逻辑层次结构,因此在您的情况下,我将考虑使用类似的方法/api/products?category=sliders来过滤产品集合。这意味着,当客户想要获得所有产品时,他们可以简单地省略查询字符串。


谢谢,所以您的意思是url对API 单一,但应使用Query String来请求其他资源吗?,还要检查一下
shaijut

是的,异步运行您的调用将减少获取数据所需的绝对时间,但总的来说,所花费的时间将更长。更多呼叫必须重复TCP连接和通信往返的开销。即使使用keep-alivearent之类的功能,也要完全删除它。
richzilla'2

类别将是单个产品资源的属性。从逻辑上讲,您将获取产品集合并过滤所有具有指定类别的产品
richzilla

因此,您的意思是,当用户打开应用程序的主页时,应该调用一个API,该API返回上述所有资源?还是当他滚动完成时应该针对特定资源进行个别呼叫,这是最佳做法?
shaijut

这取决于用户期望在应用程序的每个点看到的内容。以这个网站为例,当您单击时,questions您会看到URI为/questions,当您单击自己喜欢的标签之一时,该URI为/questions/tagged/<tagname>
richzilla
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.