为什么 odata 规格 return 204 和 404 对于这两个类似的案例

why odata specs return 204 and 404 for those two similar cases

http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part1-protocol.html

11.2.7 请求实体引用

如果资源路径终止于单个实体,则响应必须是指向相关单个实体的实体引用的特定格式表示。如果资源路径终止于单个实体并且不存在这样的实体,则服务 returns 404 Not Found.

11.2.6 请求相关实体

如果关系终止于单个实体,则响应必须是相关单个实体的特定格式表示。如果没有实体相关,则服务 returns 204 No Content

我认为这两种情况很相似,它们应该都是 return 404 或 204,为什么规范对响应的定义不同。

规范很有意义。把它想象成一个由实体值索引的内存中的实体字典,以及一个路由引擎,它将形式为 /Entities(x) 的 URI 路径映射到具有标识值 x.[= 的实体。 22=]

private static final Map<int, Entity> entities;
static
{
    Entity entity1 = new Entity() {{ id = 1; relatedThing = new Thing() {{ id = 42; }}; }};
    Entity entity2 = new Entity() {{ id = 2; relatedThing = null; }};
    entities = new HashMap<int, Entity>();
    entities.put(entity1.id, entity1);
    entities.put(entity2.id, entity2);
}

请求实体引用:如果您请求 /Entities(1)/$ref,字典查找将成功,您将获得对 id 为 1 的实体的引用。但是如果您请求 /Entities(57)/$ref,字典查找将 失败 并且您将收到错误响应 (404)。

请求相关实体:如果您请求 /Entities(1)/RelatedThing,字典查找将成功,OData 运行时将取消引用 relatedThing 属性,您将获得 Thing 对象的表示与实体相关联。如果您请求 /Entities(2)/RelatedThing,查找成功,但解引用产生 null。请注意导航 属性 relatedThing 存在(因为实体存在),但没有关联的事物(即关联的基数为 0..1)。由于查找成功,错误响应 (4xx) 是不合适的。由于取消引用产生“无”,因此指示 "no additional content to send in the response payload body" 的 HTTP 响应代码是完全合适的。