使用OData v4访问单个实体时出现问题

2020-09-01 01:27发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我使用CAP和Node.js创建了一个简单的项目。 来源可在此处找到: https://github.com/ceedee666/rqk_ws19_v3 /。 我的项目仅包含一个称为SurveyResponses的CDS实体,该实体通过服务公开。 实体的CDS如下所示:

名称空间de.fhaachen.rqkws19;
 实体SurveyResponses {密钥ID:UUID;  orderid:整数;  orderDate:DateTime;  ...}
 

在使用SQL脚本向数据库中添加了一些虚拟数据之后,我可以使用以下URL访问数据库中的所有实体:/survey/SurveyResponses

在OData v4中,可以通过其标识符寻址单个实体。 这是 odata.org 上Northwind服务的示例: https://services.odata.org/Experimental/OData/OData.svc/Persons(0 )。 当我使用我的服务尝试相同操作时,例如 使用此URL/survey/SurveyResponses('E65A56807C68EFCA160009027C5C71B7'),我收到以下错误消息:

在位置17的'SurveyResponses('E65A56807C68EFCA160009027C5C71B7')'中找不到预期的uri令牌'ODataIdentifier'

当我尝试使用以下$ filter表达式访问实体时:/survey/SurveyResponses?$ filter = ID eq E65A56807C68EFCA160009027C5C71B7,我收到此错误消息

类型'SurveyService.SurveyResponses'中不存在属性'E65A56807C68EFCA160009027C5C71B7'

但是,如果我尝试使用过滤器访问orderid属性,那么一切都会按预期进行。/survey/SurveyResponses?$ filter = orderid eq 263的请求导致

 {
   " @ odata.context":" $ metadata#SurveyResponses",
   " @ odata.metadataEtag":" W/\" v7XePRvoicjsrRX1rhd6CPTx23lX + KlEgqRqmcp4pts = \"",
   "值":[
     {
       " ID":" E65A56807C68EFCA160009027C5C71B7",
       " orderid":263,
       " orderDate":" 2019-10-09T14:40:18Z",
       " netPromoterScore":4
       "评论":"",
       " marketingOptIn":否,
       " responseDate":null,
       "状态":1
     }
   ]
 } 

任何想法如何解决这个问题? 我是否错过了实体或服务的定义?

先谢谢了。
基督徒

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我使用CAP和Node.js创建了一个简单的项目。 来源可在此处找到: https://github.com/ceedee666/rqk_ws19_v3 /。 我的项目仅包含一个称为SurveyResponses的CDS实体,该实体通过服务公开。 实体的CDS如下所示:

名称空间de.fhaachen.rqkws19;
 实体SurveyResponses {密钥ID:UUID;  orderid:整数;  orderDate:DateTime;  ...}
 

在使用SQL脚本向数据库中添加了一些虚拟数据之后,我可以使用以下URL访问数据库中的所有实体:/survey/SurveyResponses

在OData v4中,可以通过其标识符寻址单个实体。 这是 odata.org 上Northwind服务的示例: https://services.odata.org/Experimental/OData/OData.svc/Persons(0 )。 当我使用我的服务尝试相同操作时,例如 使用此URL/survey/SurveyResponses('E65A56807C68EFCA160009027C5C71B7'),我收到以下错误消息:

在位置17的'SurveyResponses('E65A56807C68EFCA160009027C5C71B7')'中找不到预期的uri令牌'ODataIdentifier'

当我尝试使用以下$ filter表达式访问实体时:/survey/SurveyResponses?$ filter = ID eq E65A56807C68EFCA160009027C5C71B7,我收到此错误消息

类型'SurveyService.SurveyResponses'中不存在属性'E65A56807C68EFCA160009027C5C71B7'

但是,如果我尝试使用过滤器访问orderid属性,那么一切都会按预期进行。/survey/SurveyResponses?$ filter = orderid eq 263的请求导致

 {
   " @ odata.context":" $ metadata#SurveyResponses",
   " @ odata.metadataEtag":" W/\" v7XePRvoicjsrRX1rhd6CPTx23lX + KlEgqRqmcp4pts = \"",
   "值":[
     {
       " ID":" E65A56807C68EFCA160009027C5C71B7",
       " orderid":263,
       " orderDate":" 2019-10-09T14:40:18Z",
       " netPromoterScore":4
       "评论":"",
       " marketingOptIn":否,
       " responseDate":null,
       "状态":1
     }
   ]
 } 

任何想法如何解决这个问题? 我是否错过了实体或服务的定义?

先谢谢了。
基督徒

付费偷看设置
发送
5条回答
小熊yu生菜
1楼-- · 2020-09-01 01:51

将正确格式的测试数据添加到数据库(dddddddd-dddd-dddd-dddd-dddddddddddddd)中之后,请求现在可以按预期工作。

使用URL/survey/SurveyResponses(E65A5680- 7C68-EFCA-1600-09027C5C71B7)结果为

 {
   " @ odata.context":" $ metadata#SurveyResponses/$ entity",
   " @ odata.metadataEtag":" W/\" v7XePRvoicjsrRX1rhd6CPTx23lX + KlEgqRqmcp4pts = \"",
   " ID":" E65A5680-7C68-EFCA-1600-09027C5C71B7",
   " orderid":263,
   " orderDate":" 2019-10-09T14:40:18Z",
   " netPromoterScore":4
   "评论":"",
   " marketingOptIn":否,
   " responseDate":null,
   "状态":1
 } 

基督徒

N-Moskvin
2楼-- · 2020-09-01 01:45

我将CDS更改为此

实体SurveyRespons {
     密钥ID:UUID @ odata.Type:'Edm.String';
     orderid:整数; 

现在,我可以使用以下URL访问单个实体:/survey/SurveyResponses('E65A56807C68EFCA160009027C5C71B7')。 现在要求单引号必须是有效的Edm.String。

潜在的问题似乎是我使用SQL函数SYUUID在数据库中创建了条目。 此函数以上面URL中显示的格式生成UUID。 相比之下,Edm.GUID需要以下格式:'dddddddd-dddd-dddd-dddd-dddddddddddd',其中每个d表示[A-Fa-f0-9](参见 https://www.odata.org/documentation/odata-version-2-0/overview /)。 我将使用正确的Edm.GUID格式再试一次。

基督徒

樱桃小丸子0093
3楼-- · 2020-09-01 01:28

嗨,

您不需要添加单引号。 这应该起作用:

/survey/SurveyResponses(E65A56807C68EFCA160009027C5C71B7)

编辑:默认情况下,UUID映射到Edm.Guid,但您可以根据需要更改此行为-> https://cap.cloud.sap/docs/guides/domain-models#mapping-uuids-to-odata

干杯

Pierre

骆驼绵羊
4楼-- · 2020-09-01 01:28

您好, Volker Buzek

目前没有 我有初始版本:

实体SurveyResponses {
      密钥ID:UUID; 

使用正确的Edm.GUID(dddddddd-dddd-dddd-dddd-dddddddddddddd),此操作可以按预期工作。 最好的部分是,使用POST请求添加实体时,会自动创建正确的GUID。

具有备用键也是一个好主意。 接下来,我将尝试将其发布到此处。
但是您发布的两个版本之间有什么区别? 对我来说,它们看起来完全一样,还是我缺少什么?

基督徒

土豆飞人
5楼-- · 2020-09-01 01:47

您好, Pierre Demouzon

感谢您的回复。

没有单引号,我得到以下错误消息:null'E65A56807C68EFCA160009027C5C71B7'不是有效的密钥。 此错误源自_parseCompoundKey方法。

最佳
基督徒

一周热门 更多>