超媒体 API - 直接请求是一种反模式吗?
Hypermedia API - Is direct requests an anti pattern?
我正在使用超媒体概念设计 API。我看到这是一个很好的做法,有一个根路由 returns 其他 API 链接到导航。
例如:我向 http://myapi.com 发出请求,它 returns
{
links: [
{ 'rel': 'profile', href: '/profile' },
{ 'rel': 'orders', href: '/orders' },
{ 'rel': 'order_types', href: '/order_types' },
...
]
}
但是,这样一来,如果root有20个资源,那就会很大了。
所以,直接请求 order_types 而不是请求 root 然后请求 order_types 是反模式吗?
这个问题有点难回答,因为我首先想到的是:它真的有那么大吗?
例如,现在您的每个链接大约需要 40 个字节。对于 20 个资源,即 800 字节。 gzip 响应(或 brotli,如果你能支持的话),你可以使它更小。如果您的总文件有一些开销(比如另外 200 字节),我们假设为 1KB,使用 gzip 之类的东西,您可能可以将其降低到 400 字节或更小。
您可以在此文件上设置缓存 headers,这样它只会在极少数情况下被请求一次。
现在你的主要问题是?是anti-pattern吗?我会说是的,你应该只有一个书签 url。
由于我目前在大规模 HATEOAS 风格的 REST 下遭受了很多痛苦 API,从我的角度来看,请帮自己一个忙,将所有链接(方法)放在起始页上。
您真的不想通过几个链接来找到您要使用(或测试)的方法。当然,您可以使用直接路径,但又只是 RPC 风格。
我很遗憾地说,HATEOAS 的整个概念虽然听起来不错恕我直言,但在实施和测试时确实很痛苦。
我正在使用超媒体概念设计 API。我看到这是一个很好的做法,有一个根路由 returns 其他 API 链接到导航。
例如:我向 http://myapi.com 发出请求,它 returns
{
links: [
{ 'rel': 'profile', href: '/profile' },
{ 'rel': 'orders', href: '/orders' },
{ 'rel': 'order_types', href: '/order_types' },
...
]
}
但是,这样一来,如果root有20个资源,那就会很大了。
所以,直接请求 order_types 而不是请求 root 然后请求 order_types 是反模式吗?
这个问题有点难回答,因为我首先想到的是:它真的有那么大吗?
例如,现在您的每个链接大约需要 40 个字节。对于 20 个资源,即 800 字节。 gzip 响应(或 brotli,如果你能支持的话),你可以使它更小。如果您的总文件有一些开销(比如另外 200 字节),我们假设为 1KB,使用 gzip 之类的东西,您可能可以将其降低到 400 字节或更小。
您可以在此文件上设置缓存 headers,这样它只会在极少数情况下被请求一次。
现在你的主要问题是?是anti-pattern吗?我会说是的,你应该只有一个书签 url。
由于我目前在大规模 HATEOAS 风格的 REST 下遭受了很多痛苦 API,从我的角度来看,请帮自己一个忙,将所有链接(方法)放在起始页上。
您真的不想通过几个链接来找到您要使用(或测试)的方法。当然,您可以使用直接路径,但又只是 RPC 风格。
我很遗憾地说,HATEOAS 的整个概念虽然听起来不错恕我直言,但在实施和测试时确实很痛苦。