标签: hateoas

REST客户端实现是否拥抱HATEOAS约束?

有没有人知道REST客户端的实现是否包含Hypermedia作为应用程序状态引擎(HATEOAS)的约束?

Sun云API似乎是一个不错的选择,从它的记录的方式,判断由作者声明该红宝石,Java和Python的实现是在作品中的效果.但到目前为止,我还没有发现代码的痕迹.

我正在寻找任何东西 - 即使是部分实施也会有所帮助.

rest hateoas

17
推荐指数
3
解决办法
4479
查看次数

在现实世界中使用Restful Web服务是否值得实现HATEOAS?

如果我将现有的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服务以处理这种情况的最佳方法是什么?或者这在现实世界中是否可以接受?

任何想法或建议在这里都非常感激.谢谢.

xml rest web-services hateoas

17
推荐指数
2
解决办法
2939
查看次数

具有Retrofit 2的多个转换器

我有一个HATEOAS(HAL) REST服务并设法与下面的代码交谈(使用halarious作为转换引擎)但是当我尝试合并转换器(stallonestallone2)时,应用程序将总是拿起第一个转换器,而不是适合于响应类型的那个当然会导致错误.

我怎么能避免只在小型细节中有所不同的重复改造?

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)

java generics hateoas gson retrofit

17
推荐指数
1
解决办法
9459
查看次数

你应该将Swagger与HATEOAS/HAL/JSON-LD结合使用吗?

我使用Swagger为我的ASP.NET Core API使用Swashbuckle,它在一个单独的文档中描述了我的API,并为所有这些信息提供了一个很好的UI.

使用像HATEOAS,HAL或JSON-LD这样的东西是否有任何优点可以与Swagger一起修改文档本身?

以下是使用Swagger和HAL的人的示例.

json hateoas swagger json-ld swashbuckle

17
推荐指数
3
解决办法
1万
查看次数

如何在Haskell中实现HATEOAS?

我有一些旧的代码,它在Web API上公开服务,它基本上用于HTTP动词.我想将此项目移至使用超媒体控件(HATEOAS).我想知道是否有任何库已经支持根据HAL或JSON-LD规范在子资源的资源表示中嵌入链接.我用Google搜索了但我找不到任何东西.很高兴知道Yesod,Snap或Happstack等成熟项目是否计划支持此功能?

编辑:为了澄清,我对REST成熟度模型的第3级感兴趣

rest haskell hateoas happstack yesod

16
推荐指数
1
解决办法
683
查看次数

(可选)在Spring Data Rest中禁用HATEOAS格式

所以假设我有一个现有的应用程序有两个端点/人和/裤子.呼叫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 …

rest hateoas spring-data hypermedia spring-data-rest

16
推荐指数
1
解决办法
1万
查看次数

休息uri设计用于更改资源的状态

我有一个可以在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)

或者可能还有别的东西?

api rest json hateoas

15
推荐指数
4
解决办法
8027
查看次数

使用XML和JSON Content-Type对RESTful API进行版本控制

根据设计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)

rest json content-type http-1.1 hateoas

14
推荐指数
2
解决办法
9862
查看次数

HATEOAS的好用例

我可以有一些HATEOAS的示例/典型用例吗?我同意它可以是一个非常强大的概念,提供很大的灵活性,但我不确定如何从HATEOAS中获益.如果您可以分享您的经验/用例,那将是很棒的.

rest web-services hateoas eve

13
推荐指数
3
解决办法
4037
查看次数

HATEOAS vs为微服务设置的GraphQL决策标准?

我最近和一个人说话,他们说他们正在完全跳过HATEOAS REST端点的开发,转而支持GraphQL.所以我很好奇为什么标准设置用于决定何时使用GraphQL与HATEOAS,或者GraphQL是一般的API网关/边缘服务器架构的更好选择?

hateoas graphql

12
推荐指数
2
解决办法
3303
查看次数