有没有人知道REST客户端的实现是否包含Hypermedia作为应用程序状态引擎(HATEOAS)的约束?
在Sun云API似乎是一个不错的选择,从它的记录的方式,判断由作者声明该红宝石,Java和Python的实现是在作品中的效果.但到目前为止,我还没有发现代码的痕迹.
我正在寻找任何东西 - 即使是部分实施也会有所帮助.
如果我将现有的Restful Web服务转换为尽可能的HATEOS,我一直在阅读很多关于潜在好处的内容.我理解在有效负载中提供链接的重要性,以减少消费者在记住下一个有效可用操作时的负担.但是,我似乎无法理解它将如何帮助我的Restful Web服务的消费者实际.
为了说明这一点,我从" 休息实践"一书中摘取了关于制作咖啡订单的例子: -
<order xmlns="http://schemas.restbucks.com">
<location>takeAway</location>
<item>
<name>latte</name>
<quantity>1</quantity>
<milk>whole</milk>
<size>small</size>
</item>
<cost>2.0</cost>
<status>payment-expected</status>
<link rel="payment" href="https://restbucks.com/payment/1234" />
</order>
Run Code Online (Sandbox Code Playgroud)
基本上,这允许消费者进行由<link>标签定义的支付.然而,实际上,消费者仍然需要知道该Web服务调用的所有语义,例如,使用什么方法(POST或PUT),在有效载荷中使用哪些请求参数以进行支付等.换句话说,消费者仍然需要依赖WADL文档来了解如何成功调用此Web服务.如果他们都在一个特定项目上使用GET,这些标签可能更有意义.否则,我真的没有看到在这里定义链接的好处...除了消费者知道他们接下来可以调用什么动作的事实,然后参考WADL来确定如何正确地调用它.
我的下一个问题是有可能以所有<link>标签结束非常重的有效载荷.例如,如果/ projects/1/users上的GET返回属于项目1的所有用户信息,我假设我最终会得到以下标记: -
<project>
<users>
<user id="12" name="mike" ... />
<user id="23" name="kurt" ... />
<user id="65" name="corey" ... />
</user>
<links>
<link rel="self" href="http://server/projects/1/users"/>
<link rel="create_user" href="http://server/projects/1/users"/>
<link rel="get_user_mike" href="http://server/projects/1/users/12"/>
<link rel="get_user_kurt" href="http://server/projects/1/users/23"/>
<link rel="get_user_corey" href="http://server/projects/1/users/65"/>
...
</links>
</project>
Run Code Online (Sandbox Code Playgroud)
如果一个项目包含说,500个用户......我不会在有效负载中有500个用户链接吗?否则,重新设计我的Web服务以处理这种情况的最佳方法是什么?或者这在现实世界中是否可以接受?
任何想法或建议在这里都非常感激.谢谢.
我有一个HATEOAS(HAL) REST服务并设法与下面的代码交谈(使用halarious作为转换引擎)但是当我尝试合并转换器(stallone和stallone2)时,应用程序将总是拿起第一个转换器,而不是适合于响应类型的那个当然会导致错误.
我怎么能避免只在小型细节中有所不同的重复改造?
public interface Stallone {
@GET("/discovery")
Call<DiscoveryResponse> discover();
@POST()
Call<LoginResponse> login(@Url String url, @Body LoginRequest secret);
}
Run Code Online (Sandbox Code Playgroud)
public static void main(String... args) throws IOException {
// Initialize a converter for each supported (return) type
final Stallone stallone = new Retrofit.Builder()
.baseUrl(BASE)
.addConverterFactory(HALConverterFactory.create(DiscoveryResponse.class))
.build().create(Stallone.class);
final Stallone stallone2 = new Retrofit.Builder()
.baseUrl(BASE)
.addConverterFactory(HALConverterFactory.create(LoginResponse.class))
.build().create(Stallone.class);
// Follow the HAL links
Response<DiscoveryResponse> response = stallone.discover().execute();
System.out.println(response.code() + " " + response.message());
Assert.assertNotNull(response.body());
String …Run Code Online (Sandbox Code Playgroud) 我使用Swagger为我的ASP.NET Core API使用Swashbuckle,它在一个单独的文档中描述了我的API,并为所有这些信息提供了一个很好的UI.
使用像HATEOAS,HAL或JSON-LD这样的东西是否有任何优点可以与Swagger一起修改文档本身?
以下是使用Swagger和HAL的人的示例.
我有一些旧的代码,它在Web API上公开服务,它基本上用于HTTP动词.我想将此项目移至使用超媒体控件(HATEOAS).我想知道是否有任何库已经支持根据HAL或JSON-LD规范在子资源的资源表示中嵌入链接.我用Google搜索了但我找不到任何东西.很高兴知道Yesod,Snap或Happstack等成熟项目是否计划支持此功能?
编辑:为了澄清,我对REST成熟度模型的第3级感兴趣
所以假设我有一个现有的应用程序有两个端点/人和/裤子.呼叫GET /人员返回:
[
{
"name":"john",
"age":37,
"pants":[
{
"color":"green",
"brand":"levis",
"size":"medium"
},
{
"color":"indigo",
"brand":"jncos",
"size":"medium-with-huge-legs"
}
]
},
{
"name":"june",
"age":23,
"pants":[
{
"color":"pink",
"brand":"gap",
"size":"small"
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
如果我使用Spring Data Rest并拨打GET/person,我会收到类似的信息:
{
"_links":{
"next":{
"href":"http://myapp.com/people?page=1&size=20"
},
"self":{
"href":"http://myapp.com/people{&page,size,sort}",
"templated":true
},
"search":{
"href":"http://myapp.com/people/search"
}
},
"_embedded":{
"people":[
{
"name":"john",
"age":37,
"_links":{
"self":{
"href":"http://myapp.com/people/john"
},
"pants":{
"href":"http://myapp.com/people/john/pants"
}
}
},
{
"name":"june",
"age":23,
"_links":{
"self":{
"href":"http://myapp.com/people/june"
},
"pants":{
"href":"http://myapp.com/people/june/pants"
}
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
假设我有一堆我不想改变的现有客户端 - 在某些情况下是否有任何方法可以禁用响应的超媒体部分(比如Accept ="application/json")但是为了启用它们其他人(Accept …
我有一个可以在URI处访问的资源,/resources/{resource_identifier}它有一个我想要访问的"status"属性.我想到了一些选择,这将是"最好的"或"最RESTfull"?
选项一将操作附加到URI并让客户端POST访问这些URI
/resources/{resource_identifier}/void
/resources/{resource_identifier}/open
/resources/{resource_identifier}/close
Run Code Online (Sandbox Code Playgroud)
这看起来很笨拙.
选项二在URI中使用查询参数并将客户端PATCH用于这些参数
/resources/{resource_identifier}?transition=void
/resources/{resource_identifier}?transition=open
/resources/{resource_identifier}?transition=close
Run Code Online (Sandbox Code Playgroud)
选项三使用请求的有效负载并拥有客户端PUT
/resources/{resource_identifier}
Run Code Online (Sandbox Code Playgroud)
负载选项:
{ ..., "status" :"void" }
{ ..., "status" :"open" }
{ ..., "status" :"close" }
Run Code Online (Sandbox Code Playgroud)
或者可能还有别的东西?
根据设计RESTful接口的优秀演示,实现版本控制的首选方法是使用Accept-header,使用类似于:
GET /products HTTP/1.1
Host: example.com
Accept: application/vnd.com.myservice.v2+xml
Run Code Online (Sandbox Code Playgroud)
这适用于XML Content-Types,但是可以使用相同的方案对JSON等效的版本进行版本控制吗?
即,是否有可能要求:
GET /products HTTP/1.1
Host: example.com
Accept: application/vnd.com.myservice.v2+json
Run Code Online (Sandbox Code Playgroud)
响应将是这样的:
HTTP/1.1 200 OK
Content-Type: application/vnd.com.myservice.v2+xml; charset=UTF-8
Allow: GET, POST
<?xml version="1.0" encoding="utf-8"?>
<products xmlns="urn:com.example.products"
xmlns:xl="http://www.w3.org/1999/xlink">
<product id="1234" xl:type="simple"
xl:href="http://example.com/products/1234">
<name>Red Stapler</name>
<price currency="EUR">3.14</price>
<availability>false</availability>
</product>
</products>
Run Code Online (Sandbox Code Playgroud)
和JSON等价物(有点):
HTTP/1.1 200 OK
Content-Type: application/vnd.com.myservice.v2+json; charset=UTF-8
Allow: GET, POST
[
{
id: "1234",
links: [
{
rel: "self",
href: "http://example.com/products/1234"
}
],
name: "Red Stapler",
price: {
currency: "EUR",
value: …Run Code Online (Sandbox Code Playgroud) 我可以有一些HATEOAS的示例/典型用例吗?我同意它可以是一个非常强大的概念,提供很大的灵活性,但我不确定如何从HATEOAS中获益.如果您可以分享您的经验/用例,那将是很棒的.
我最近和一个人说话,他们说他们正在完全跳过HATEOAS REST端点的开发,转而支持GraphQL.所以我很好奇为什么标准设置用于决定何时使用GraphQL与HATEOAS,或者GraphQL是一般的API网关/边缘服务器架构的更好选择?
hateoas ×10
rest ×7
json ×3
web-services ×2
api ×1
content-type ×1
eve ×1
generics ×1
graphql ×1
gson ×1
happstack ×1
haskell ×1
http-1.1 ×1
hypermedia ×1
java ×1
json-ld ×1
retrofit ×1
spring-data ×1
swagger ×1
swashbuckle ×1
xml ×1
yesod ×1