OData请求/响应中_metadata节点内id和uri属性的区别是什么?

3
_metadata节点中的属性iduri有什么区别?UI5应用程序发送的所有请求/响应都包含这两个属性,而且每次都相等。这不是一种不必要的冗余吗?在网关服务器中是否有与这些属性对应的配置项?我希望只有一个属性包含与服务部分相关的键,即SERVICE_ID / Entity_Name / keys
我目前使用版本1.71
let oDataResponse = {
    "d": {
        "__metadata": {
            "id": "https://domain:port/sap/opu/odata/sap/SERVICE_ID/HeaderSet('000001234567890')",
            "uri": "https://domain:port/sap/opu/odata/sap/SERVICE_ID/HeaderSet('000001234567890')",
            "type": "SERVICE_ID.Header"
        },
        "FIELD_1": "abc",
        "FIELD_2": "abc",
        "FIELD_N": "abc"
    }
};

显然在OData V2中,__metadata中的id并非从一开始就被规定为什么,因为根据commit:36bf9af,它仅用于内部测试。 - Boghyon Hoffmann
1个回答

1
ID可以是相对URL,在瞬态请求的情况下可以为空。此外,在其他几种情况下,它可能与URL不同,请参见odata文档
id控制信息包含实体ID,参见[OData-Protocol]。按照惯例,实体ID与实体的规范URL相同,如[OData-URL]中所定义。
如果请求metadata=full或请求metadata=minimal且省略了任何非瞬态实体的关键字段或实体ID与实体的规范URL不相同,则必须在响应中出现id控制信息。
IRI-to-URI转换如[RFC3987]所定义,相对分辨率如[RFC3986]的第5.2节所定义,并且百分比编码规范化如[RFC3986]的第6节所定义。
请注意,实体ID必须在所有语言中保持不变,因此,如果关键值依赖于语言,则如果ID与本地化关键值的约定不匹配,则必须包括该ID。如果表示ID,则可以是相对URL。
如果实体是瞬态的(即无法读取或更新),则必须在OData 4.0负载中出现id控制信息并具有空值。在4.01负载中,瞬态实体不需要具有id控制信息,而4.01客户端必须将既没有id控制信息也没有完整一组关键属性的实体视为瞬态实体。
id控制信息不得出现在集合中。在这种情况下,其含义保留给本规范的未来版本。
ID等于null的实体无法与其他实体进行比较、重新读取或更新。如果指定了metadata=minimal并且实体中不存在ID,则必须将规范URL用作实体ID。

这也适用于 V2 吗?问这个问题是因为 SAP 产品中的 OData 服务仍然主要是 V2。 - Boghyon Hoffmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接