为了保护在SAP云平台ABAP环境上运行的OData服务免受恶意客户端的攻击,如果客户端不使用适当的客户端分页,ABAP RESTful编程模型将强制执行OData协议定义的服务器端分页。
适当表示必须使用$top,并且$top不应大于5000。如果它大于5000,比如10500,调用方将只接收5000个条目,因为框架强制执行硬编码的服务器端分页。此外,客户端还将获得下一个链接,物联网大赛,该链接在响应末尾带有$skiptoken。
如果未使用$top,框架将响应限制为100个实体,并将添加下一个链接以检索其余实体。
强制服务器端分页对于任何支持OData协议的客户端来说都应该不是问题,因为OData客户端OData协议中规定的"必须将下一个链接的URL视为不透明的"。
但对于使用SAP UI5以外的客户端库的开发人员来说,这可能会让他们感到意外。虽然SAPUI5表控件会自动使用适当的客户端查询选项($top和$skip),但使用非SAPUI5客户端库(如.NET)的开发人员可能会想,为什么不管使用什么查询选项,什么是大数据,服务都只返回100个实体。这些开发人员只需实现对客户端分页的支持,并且必须使用$top和$skip。
因此,如果您打算使用具有第三方客户端库的OData服务,或者如果您开发了不支持自动处理适当客户端的自定义UI5控件,那么本文只是您的必读资料SAPUI5中的表控件提供的分页
服务器端分页–强制
假设您已注册SAP云平台环境的试用版,网络云服务器,并已为he服务定义/DMO/TRAVEL###创建了服务绑定Z_SKIPTOKEN#TEST#####################如果您在自己的包Z如果将#####替换为三位数字或三个字符的唯一组合(这里我选择了AFI)。
激活本地服务端点后。
您可以单击链接服务URL,永久免费的云服务器,而不是启动SAP Fiori Elements预览。您现在可以使用浏览器中的以下URL检索预订数据
(其中#####表示字符/数字的唯一组合)
因此您将得到如下响应:
请注意提要的最后一个条目:
因为您可以看到ABAP运行时只返回100个对象,并向客户端的响应添加一个链接可以跟随获取剩余的条目。
由于前100个条目已经由服务器传递,下一个链接包含查询选项$skiptoken=100。
通过客户端分页限制响应
如果客户端通过添加例如查询选项$top=200来使用客户端分页,服务器将不强制服务器端因此,分页和响应将不包含带有skiptoken的链接。
请求:
响应:
强制执行服务器端分页–第2部分
但是,如果我们的恶意客户端使用客户端分页,但试图通过使用$top的巨大值(例如$top=10500)检索大型响应,会发生什么情况?
在这种情况下,OData框架再次强制服务器端分页,只返回5000个实体:
响应的最后一个条目将包含以下下一个链接:
因此客户端必须发送两个额外的请求来获取所有10500个实体,即
最后
最后一个响应将再次不包含下一个链接。
注意-自定义实体的实现
如果您实现一个自定义实体,其中数据通过您自己的ABAP代码检索,您将遇到一个问题:如果您的实现不处理,云是什么,将引发异常CX\u RAP\u QUERY\u NOT\u FULLY\u IMPLMTD服务器端分页。
因此您的编码必须调用get\u分页方法评估此方法的结果,并根据客户端请求的页面大小和偏移量返回结果。
get\u分页处理的适当实现可以在我下面的博客中找到
如何在ABAP RESTful中实现自定义实体使用远程功能模块的编程模型