我的JSON响应是否应包含请求查询参数的值?

时间:2016-10-18 13:32:20

标签: api-design

我应该在响应中包含输入查询参数吗?

让我们说我有一个返回人名的端点。我允许我的客户按国家/地区过滤结果。

我想知道,我是否应该在响应中包含country属性,即使它与客户端请求的匹配。

例如,当用户发送以下请求时

/人?国家=英国

我应该返回

[{"name":"tom"},{"name"="tim"}]

[{"name":"tom","country":"UK"},{"name":"tim","country":"UK"}]

作为回应?

3 个答案:

答案 0 :(得分:0)

取决于客户需要哪些数据。

如果您只想告诉客户端他们要求的内容,您可以在API中有一些约定,即顶级节点显示请求中的参数是产生此响应的内容。

{"requestParams":"country=UK&city=London", data: [{"name":"tom", "street":"Wallaby"}, {"name":"tim", "street":"West"}]

但是你肯定不希望通过返回请求参数来返回敏感信息。

答案 1 :(得分:0)

为了回答你的问题,我们首先应该澄清REST背后的实际意图,因为这通常是错误的。 REST不是关于干净的URI或像API这样的buzzwordy,它是关于将客户端与类似于Web浏览器的服务器分离,这些服务器非常强大,并且几乎不会破坏服务器更改。

为了实现这一点,客户不应对API或其资源有任何假设或预定义知识。应该通过请求 - 响应交互来学习它需要知道的一切。这并不容易实现,但可以确保在服务器端进行的更改不会破坏客户端。

因此,服务器应该包含链接(HATEOAS),客户端可以使用它来在调用这些URI时执行状态更改。支持协议(通常是HTTP)定义了您可以对这些URI执行的动词(或方法)。为了避免将客户端耦合到服务器,客户端可以将已知的受支持文档格式列表(例如,在Web浏览器中为text/html)发送到服务器,并且服务器可以选择一种受支持的文档类型和将资源的状态转换为此格式(如果支持)。此内容类型现在定义返回给客户端的内容。这可能是刚刚转换为相应表示的资源的完整内容(因此代表性状态转移; REST),或者可能只是某些资源状态的子视图。

现有各种可用的内容类型定义,但API提供商可以创建自己的内容类型定义,也可以根据需要从其他内容类型定义中扩展。然而,自定义内容类型的缺点是客户端需要以某种方式学习这些内容类型。媒体类型虽然是RESTful客户端的实际知识库,但Roy Fielding也表示大部分设计工作应该放在媒体类型及其处理中:

  

REST API应该花费几乎所有的描述性工作来定义用于表示资源和驱动应用程序状态的媒体类型,或者为现有标准媒体定义扩展关系名称和/或启用超文本的标记类型。在媒体类型的处理规则的范围内(并且在大多数情况下,已经由现有媒体类型定义)应该完全定义用于描述在感兴趣的URI上使用什么方法的任何努力。 [失败在这里意味着带外信息正在推动互动而不是超文本。](Roy Fielding

虽然application/xmlapplication/json非常受欢迎且受到广泛支持,但它们并没有传达太多语义。 application/atom+xmlapplication/hal+json之类的内容至少支持支持HATEOAS要求的链接。

因此,为了真正实现RESTful,您应该为people信息重复使用现有的内容类型vCard,或者设计新的内容并将其公之于众,以便客户端 - 实现者有办法学习这些内容类型的处理。常见的vcard内容类型已经定义了您在自定义内容类型上可能返回的内容,您可以随意返回任何内容,但至少支持此内容类型的客户端将能够进一步处理数据。 / p>

答案 2 :(得分:0)

我只是说你应该选择你的项目的最小代表与收集回复一起发送,并在回复那些时保持一致。

由于查询值总是依赖于最终返回的项目的基础数据,因此该数据属于您在请求单个项目时返回的表示 - 即/ people / tom将包括{“country:”UK“}。只需确定要包含在列表中的完整项目的哪些部分。

如果提供的查询过滤的属性不是通常的“人”的最小代表,则不要包含它。如果它通常是您在/ people?foo调用中包含的人员数据的一部分,那么仍然包含它。