创建ABAP REST类以查询多个实体

创建ABAP REST类以查询多个实体,rest,abap,Rest,Abap,我的环境中没有可用的网关,我想使用ABAP REST库公开web服务: 通过一个非常简单的示例,我成功创建了一个类来读取单个域的值列表,GET调用非常简单: http://mydomain/domainvalues/XFELD GET实现在我的类ZCL_REST_DOMAIN_值中,它是CL_REST_资源实现IF_REST_RESOURCE~GET方法的扩展 现在,我希望能够读取或查询多个域。我不是REST方面的专家,但我看到了两个搜索选项,一个使用与单个实体相同的URI,另一个使用特殊的UR

我的环境中没有可用的网关,我想使用ABAP REST库公开web服务:

通过一个非常简单的示例,我成功创建了一个类来读取单个域的值列表,GET调用非常简单:

http://mydomain/domainvalues/XFELD

GET实现在我的类ZCL_REST_DOMAIN_值中,它是CL_REST_资源实现IF_REST_RESOURCE~GET方法的扩展

现在,我希望能够读取或查询多个域。我不是REST方面的专家,但我看到了两个搜索选项,一个使用与单个实体相同的URI,另一个使用特殊的URI进行查询

  • http://mydomain/domainvalues?Id=XFELD,WERKS_D
  • http://mydomain/query/domainvalues?Id=XFELD,WERKS_D
在后端,我是否应该使用第二种方法,只为这个调用创建一个名为实例ZCL\u REST\u DOMAIN\u VALUES\u QUERY的类,再次实现GET方法


或者,我是否应该使用POST方法发送ID列表以获取身体?

SAP自身的内部指导原则建议将OData和plain REST服务塑造成相似的形状,以避免混淆并方便在两者之间切换:

http://mydomain/domainvalues?$filter=Id in ('XFELD', 'WERKS_D')
两者都将由相同的REST端点处理程序类提供服务,当然,您可以自由地为案例创建单独的方法或委托


正如@SandraRossi在下面正确指出的那样,在将查询参数移交给某个较低级别之前,请记住对其进行清理(=白名单/黑名单/转义),以防止SQL注入攻击。

SAP自己的内部指导原则建议将OData和普通REST服务进行类似的调整,为避免混淆并便于在两者之间切换:

http://mydomain/domainvalues?$filter=Id in ('XFELD', 'WERKS_D')
两者都将由相同的REST端点处理程序类提供服务,当然,您可以自由地为案例创建单独的方法或委托


请记住,在将查询参数移交给某个较低级别之前,先清理(=白名单/黑名单/转义),以防止SQL注入攻击,正如@SandraRossi在下面正确指出的那样。

您可以自由选择所需的方式。例如,您可以像OData一样操作(
$filter
在查询字符串中)。您认为创建第二个REST服务有哪些优势?在使用SAP Gateway的OData中,您可以为“域”实体使用GetEntity和GetEntitySet方法。在网关中,GET请求被处理,如果带有ID,则定向到GetEntity;如果没有ID,则定向到GetEntitySet方法(或者如果是带有筛选器的查询)。我想用“原始”RESTAPI来模拟simlar行为,但我不确定是否可以用单个类来实现,以及如何做到尽可能干净。我想问的是,在CL_REST_HTTP_处理程序的实现中应该添加什么,方法if_REST_application~get_root_处理程序,如果我需要一个或两个实现get的类,很抱歉,看起来您知道如何解决,但无法在这两个解决方案中进行选择。现在你知道根据我和Florian的说法哪一个最简单了。不要像这样结束:)哈哈!我不知道,我会记得的!是的,当我必须决定一种新的实现方法时,我有点像那头驴子。特别是因为这个决定将影响刚刚开始的整个项目,所以我需要有人告诉我“SAP就是这样做的”,就像Florian的回答一样。你可以自由选择你想要的方式。例如,您可以像OData一样操作(
$filter
在查询字符串中)。您认为创建第二个REST服务有哪些优势?在使用SAP Gateway的OData中,您可以为“域”实体使用GetEntity和GetEntitySet方法。在网关中,GET请求被处理,如果带有ID,则定向到GetEntity;如果没有ID,则定向到GetEntitySet方法(或者如果是带有筛选器的查询)。我想用“原始”RESTAPI来模拟simlar行为,但我不确定是否可以用单个类来实现,以及如何做到尽可能干净。我想问的是,在CL_REST_HTTP_处理程序的实现中应该添加什么,方法if_REST_application~get_root_处理程序,如果我需要一个或两个实现get的类,很抱歉,看起来您知道如何解决,但无法在这两个解决方案中进行选择。现在你知道根据我和Florian的说法哪一个最简单了。不要像这样结束:)哈哈!我不知道,我会记得的!是的,当我必须决定一种新的实现方法时,我有点像那头驴子。特别是因为这个决定会影响刚刚开始的整个项目,所以我需要有人告诉我“SAP就是这样做的”,就像Florian answer中的回答一样。@RaTio在HTTP请求处理程序中,就像您对
Id
所做的那样,通过
数据(filter\u value)=server->Request->get\u uri参数获取
$filter
的值(`$filter`)
重要提示:不要直接在
SELECT…WHERE(filter)
中传递
$filter
值,以避免SQL注入攻击!您必须从筛选器列表中提取每个单独的值,并使用类似
filter=filter>的内容将其转义#(让filter2=`0=1`用于filter\u列表中的filter\u值NEXT filter2=filter2&&`OR ID=`&&CL\u ABAP\u DYN\u PRG=>ESCAPE\u QUOTES(filter\u值)&&``
添加了。这总是一个有用的提示。谢谢,Sandra!@HTTP请求处理程序中的RaTio,就像您对
ID
所做的那样,通过
数据(filter\u值)获取
$filter
=server->request->get_uri_参数(`$filter`)
重要提示:不要直接在
SELECT…WHERE(filter)
中传递
$filter
值,以避免SQL注入攻击!必须从筛选器列表中提取每个单独的值,并使用类似
filter=filter>的内容将其转义#(让filter2=`0=1`用于filter\u列表中的filter\u值NEXT filter2=filter2&&`OR ID=`&&CL\u ABAP\u DYN\u PRG=>转义引号(filter\u值)&&&`