HTTP REST 是否应该以客户端期望的特定格式向服务器 return 请求数据?
Should HTTP REST request to the Server return data in specific format expected by the Client?
如果在客户端使用需要特定格式数据的库(例如 [{id: 1, name: "Jack", available: true}]
),服务器应该以客户端请求的确切结构处理数据还是发回通用数据(例如 [{userId: 1, username: "Jack", isUserAvailable: true}]
)然后可以在客户端建模,以避免在客户端库将来更改时发生紧密耦合和破坏?
如果您有遗留系统或无法更改格式或需要支持无法更改的特定客户端,请考虑可以在不同端点为您执行转换的 API 网关。
但通常情况下,请让您的 API 尽可能开放。您几乎无法为每个不同的客户定义它。
客户端必须依赖于服务端提供的接口,这个接口可以看作是服务端和客户端约定的契约。这确实暗示了所提供的数据结构,并且是一种耦合形式。因此需要清楚地描述/定义 API 并制定版本控制和废弃这些 API 的策略。
所以乍一看这似乎是一个紧耦合,但不一定是。客户端和服务器可能会或可能不会使用相同的语言/数据表示。在此示例中,客户端可以使用 JSON 自由地做任何它想做的事情。它可以使用所有数据或仅使用一个属性。所有这些都与服务器无关。同样,客户端不关心服务器如何创建此 JSON 字符串。由于服务契约仅描述接口和由此产生的服务器/客户端实现的自由度,耦合可以被认为是松散的(足够)。
如果在客户端使用需要特定格式数据的库(例如 [{id: 1, name: "Jack", available: true}]
),服务器应该以客户端请求的确切结构处理数据还是发回通用数据(例如 [{userId: 1, username: "Jack", isUserAvailable: true}]
)然后可以在客户端建模,以避免在客户端库将来更改时发生紧密耦合和破坏?
如果您有遗留系统或无法更改格式或需要支持无法更改的特定客户端,请考虑可以在不同端点为您执行转换的 API 网关。
但通常情况下,请让您的 API 尽可能开放。您几乎无法为每个不同的客户定义它。
客户端必须依赖于服务端提供的接口,这个接口可以看作是服务端和客户端约定的契约。这确实暗示了所提供的数据结构,并且是一种耦合形式。因此需要清楚地描述/定义 API 并制定版本控制和废弃这些 API 的策略。
所以乍一看这似乎是一个紧耦合,但不一定是。客户端和服务器可能会或可能不会使用相同的语言/数据表示。在此示例中,客户端可以使用 JSON 自由地做任何它想做的事情。它可以使用所有数据或仅使用一个属性。所有这些都与服务器无关。同样,客户端不关心服务器如何创建此 JSON 字符串。由于服务契约仅描述接口和由此产生的服务器/客户端实现的自由度,耦合可以被认为是松散的(足够)。