点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
某些背景:我们的团队中没有人以前有过使用Gateway或OData的经验,但是由于项目截止日期迫在眉睫,我们正在努力尽快学习。 我一直在浏览SCN博客(特别感谢作者,非常有帮助),并且到目前为止,在新的" ABAP到未来"一书的帮助下,我已经能够创建一个运行的简单服务。
在这一点上,我有一些一般性的问题,这些问题看似很愚蠢,但是如果是这样的话,我可以采取"您在这里遥不可及"的答案。 如果我正确阅读,我们使用的是EHP6,Gateway 2.0 SP 12。
1。 如果服务只能接受一个值,例如PARAMETER,该怎么办? 我阅读了此博客中介绍了如何实现过滤器并很好地理解它,但从本质上讲,过滤器看起来与选择选项等效。 有没有办法改变它或做一些不同的事情? 还是我们在"参数思维"方式上根本上是错误的?
2。 与p有关。 1-是否可以轻松实现OBLIGATORY之类的东西? 即 该服务需要提供一定的价值,否则它将无法正常工作。
3。 将成功/错误消息返回给服务使用者的良好实践是什么? 在什么情况下服务应该引发异常而不是仅返回错误消息? (我不确定这些选项如何对服务使用者起作用。)返回消息的最佳方法到底是什么? 一些字符串表? BAPIRET2似乎太重了...我发现了一些有关消息和异常的现有问答(附件A ),但它们与非常具体的情况有关,我正在寻找一般指导。
谢谢!
嗨耶琳娜,
1。 如果只想接受一个参数,则必须在segw/项目中定义一个键,然后重新定义get_entity方法。 这将仅导入实体集的一行,但是您也可以只返回一行。 如果您想要更多,则需要使用$ filter并开发自己的支票。 在那里,您需要重新定义get_entityset。
2。
3。也可以通过重新定义来完成此操作,只需将您的内容放入其中,并在异常情况下抛出异常。
3。 取决于您要退货的内容。 我同时使用,视情况而定。 现在,我为网上商店开发了一些休息服务,在这里,我使用了内部使用的bapi的返回结构。 在开发一些服务来更新表之前,在这种情况下,我只是使用了异常。 因此,实际上取决于行的另一端。
如果您想了解有关该主题的更多信息,我还可以在github上分享一些代码。
〜Florian p>
谢谢大家,谢谢! 为了澄清一些要点-我们计划将这些网关服务本质上公开为接口。
例如,列表中最简单的API之一就是为交付生成一个"容器ID"。 业务合作伙伴(例如,分包商)将使用API向我们发送文件编号,然后我们将其发回给该合作伙伴用于运输的"容器ID"。 确定容器ID涉及一些业务规则。
在这种情况下,文档可以是一个选择选项,但是作为"参数",我们希望API使用者(=我们的业务伙伴)提供其"合作伙伴ID"。 自然,它只能有一个价值。 此标识未绑定到任何SAP标准主数据(如供应商或客户)。 这是一个完全自定义的ID(在Z表中引用),只需要在API中驱动某些业务规则即可。 该合作伙伴ID必须是一个必需的值,因此是我的问题。
对于第1点:
答案取决于您期望参数执行的操作。 如果参数是记录的关键,那么就像@ Florian Henninger 所说的那样 可以使用实体的get_entity方法返回它标识的单个记录。 但是,如果您希望获得多个记录,例如select语句的where条件,则可以继续使用$ filter odata选项,而Get_entitySet将管理过滤器。 (使用通过CDS生成的Odata可以自动处理此问题,而无需您对此进行编码)。
或者,如果您的要求是完全自定义的,则使用导入功能(我认为这里不太合适)。
对于第2点:
除了已经建议的以外,这可能是一个选项。 https://博客。 sap.com/2017/04/06/cds-view-with-input-parameters-consumption-via-odata/
对于第3点:
Bapiret2是必经之路,SAP提供了非常完整的选项来使用使用
/IWBEP/CX_MGW_BUSI_EXCEPTION
或/IWBEP/CX_MGW_TECH_EXCEPTION
例外提供的标准代码来处理这些问题 ,从我的角度来看,技术异常是您不会想到的致命错误(或者本质上是技术错误,例如配置/定制的一部分不可用等。),业务异常是您得到的错误 由于业务场景,例如来自BAPI的回报。这里是指向完整文档的链接。 https://help.sap.com/viewer/68bf513362174d54b58cddec28794093 /7.4.19/zh-CN/01a226519eff236ee10000000a445394.html
基本上,这会添加所有BAPI错误和用于响应的自定义标头,最重要的是,SAP标准UI5视图可以很好地与此配合使用,并且可以立即使用。 例如: https://sapui5.hana.ondemand.com/#/topic/52824a6c316a413dbd7bd5f29522dce2 a>
我对答复的详细内容不太满意,如果您还有其他问题,请告诉我,我会尽力补充。
希望这会有所帮助。
您好 Jelena Perfiljeva ,
只要让我知道何时 您需要更多信息。 还花了我一段时间来分享它,很高兴分享我所做的所有愚蠢的尝试:-)
〜弗洛里安
嗨耶琳娜,
这不是您可以标记为答案的答案,但是这里有一些信息希望对您有所帮助:
首先要了解OData Service的使用者是谁,并定义您的实体和交互 是必须的。 例如 如果仅搜索PO,则无需实现所有方法。 例如 假设您要为自由式Fiori UI提供OData服务,并且该UI需要在PO上进行搜索,则可以有一个名为PurchaseOrders的实体集,以及一个名为PurchaseOrder的实体。 现在,如果您要按采购订单编号,名称,供应商等进行搜索; 您可以使UI开发人员真的很容易,并告诉他们只使用Name字段,而在后端,无论如何(例如,这是UI开发人员之间的协议),您都可以使用该字段来搜索PO编号,名称和供应商 并且后端开发人员记住UI部分是最难解决的部分。)
完成此操作后,这将需要您仅实现POsGetEntitySet方法-可能不需要其他方法 。 另外,您可以决定如何在此例程中构建搜索。 例如 您可以使用选择选项样式,也可以将字符串切成小块,以便使其像Google一样进行搜索。 例如,搜索名为* P Jel *的雇员实际上应该是在* P *和* Jel *上进行搜索,因此顺序无关紧要。
注意-还有一个查询选项可以
TL;为此,DR:根据用户界面要求设计API,以使UI开发人员的生活尽可能轻松 可能。 重用不是网关服务的重点。 即使只是对现有Fiori应用程序进行扩展,这也适用。
当然-当您开始谈论CDS时,所有这些都消失了,所以我假设您正在谈论SEGW定义的OData服务
对于"必需",在上面的示例中,如果未提供搜索参数,则可以不返回任何实体。 有时候,如果没有过滤器就按顺序获取前20个实体花费的时间太长,这是有道理的。
我只能说的规则是,除非创建/更新/删除更改类型,否则您仅应抛出业务异常
最后的建议是,(当然,如果允许的话)您的下一条消息是,在您的问题中添加更具体的示例和细节,因为当今有很多不同的编程模型,并且
希望有帮助,
Matt
ps。 确保您了解一些进行分页,过滤和排序的实用程序方法-当您可以获取所有实体时,这是非常有用的,因为没有太多,然后使用它们为您完成繁重的工作。 p>
感谢您的回复! 我刚刚在问题中添加了注释,其中包含我正在处理的特定示例。 对我来说,令人困惑的是,在我们的场景中,"参数"实际上并没有直接用于数据检索中。 这是业务逻辑中使用的值。 我看过的所有示例都类似于"哦,我将此值放入过滤器,然后在SELECT中使用它"。 但就我们而言,事实并非如此。 这也是为什么我感觉这是错误的方法,并且可能缺少某些功能的原因。 也许它甚至不应该是"参数",而应该内置在服务调用本身中。 但是到目前为止,我在SEGW中还没有看到其他任何内容。
您好,Jelena,
因为您已经收到很多正确且有用的答案,所以我只在此处添加一些评论 :
1。
正如 Amarpreet Singh 所述, 如果您不想使用$ filter = myproperty eq,则函数Import可能是您的解决方案,因为函数Imports接受诸如…/employeedforhowmanyyears?empid = 12345之类的参数。
此外,该选项 使用搜索字符串。
2 a)
默认情况下,函数导入的参数是必需的。
您必须按照此处,使其成为可选项/可为空:-)。
2b)
如果 对于CDS视图有一个必填字段,您可以使用注释
@ ObjectModel.mandatory:true
,但这可能对您没有帮助,因为您说过您正在从事 SAP Gateway 2.0 SP12,因此不在SAP NetWeaver 750或更高版本上。
上面提到的注释产生以下注释:
Book:
还有一本书涵盖了SAP网关,从SAP Gateway 2.0到SAP Cloud Platform ABAP环境中可用的ABAP RESTful编程模型。
SAP网关和OData的第三版
最好的问候
安德烈
一周热门 更多>