扩展包推荐:为你的 Laravel Restful API 添加 HATEOAS


Laravel HATEOAS是GüntherDebrauwer的一个软件包,它使用HATEOAS链接公开REST API的授权逻辑。

HATEOAS允许您公开REST API的授权逻辑。该软件包可以轻松地将HATEOAS链接添加到Laravel API资源中。

这个包定义了一个 artisan 命令,用于创建一个新的 HATEOAS 类,其中包含了生成链接JSON响应的方法:

class MessageHateoas
{
    use CreatesLinks;

/**
 * 获取 HATEOAS 链接用来查看消息。
 *
 * @param \App\Message $message
 *
 * @return null|\GDebrauwer\Hateoas\Link
 */
public function self(Message $message)
{
    if (! auth()->user()->can('view', $message)) {
        return;
    }

    return $this->link('message.show', ['message' => $message]);
}

/**
 * 获取 HATEOADS 链接用来删除消息。
 *
 * @param \App\Message $message
 *
 * @return null|\GDebrauwer\Hateoas\Link
 */
public function delete(Message $message)
{
    if (! auth()->user()->can('delete', $message)) {
        return $this->link('message.archive', ['message' => $message]);
    }

    return $this->link('message.destroy', ['message' => $message]);
}

}

然后在你的 Laravel 资源类中,你可以使用这个包的 HasLinks trait 来引入连接:

class MessageResource extends JsonResource
{
    use HasLinks;

/**
 * 将数据源转化为数组.
 *
 * @param \Illuminate\Http\Request $request
 *
 * @return array
 */
public function toArray($request)
{
    return [
        'id' => $this->id,
        'text' => $this->text,
        '_links' => $this->links(),
    ];
}
}

最后,上面示例的返回结果可能类似于下面的JSON响应:

{
    "data": [
        {
            "id": 1,
            "text": "Hello world!",
            "_links": [
                {
                    "rel": "self",
                    "type": "GET",
                    "href": "http://localhost/message/1"
                },
                {
                    "rel": "delete",
                    "type": "DELETE",
                    "href": "http://localhost/message/1"
                }
            ]
        }
    ]
}

如果您不熟悉HATEOAS,它是Hypermedia As The Engine of Application State的缩写。您可以从HATEOAS - 维基百科页面获得HATEOAS的非常好的概述。

了解有关此软件包的更多信息,获取完整的安装说明,并在GitHub上查看源代码 gdebrauwer/laravel-hateoas.

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laravel-news.com/laravel-hateoas...

译文地址:https://learnku.com/laravel/t/33430

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1
Summer

什么是HATEOAS

或者说:

  • 为何会有HATEOAS
  • HATEOAS有什么好处或作用?

找个例子来比喻,就容易理解了:

举例解释HATEOAS

比如有个用户的对象,或者说资源,定义是:

class Customer {
    String name;
}

而普通的RESTGET后返回的信息是:

{
    "name" : "Alice"
}

而简单点的HATEOAS则返回是:

{
    "name": "Alice",
    "links": [ {
        "rel": "self",
        "href": "http://localhost:8080/customer/1"
    } ]
}

好处是:

客户端,不需要再去问提供了接口的服务器端,就可以通过此HATEOAS返回的信息中知道一些额外的信息:

  • rel: 表示relationship关系。此处的self指的是就是对象Customer自己本身。
    • 而更加复杂点的情况中,可能会包含其他的对象,比如"rel":"customer"
  • href:当前对象的完整的url地址。

由此可以看出:

如果后台接口支持,或者说实现了HATEOAS这套标准(规范),那么:

调用接口的前端(移动端等),就可以像:

用户通过点击页面的href的链接地址,而跳转到其他网页,实现浏览网页的过程了。

-> 让调用REST的api就可以实现,类似于用户浏览网页的从一个页面跳转到另外一个页面的过程了

-> 而这种超链接方式的api用于告诉用户:该资源的只允许哪些操作(比如GET,POST),以及不允许哪些操作(比如DELETE

-> 从而达到方便用户更加清楚使用你的接口的目的

另外,再贴出来一个复杂点的HATEOAS的例子,仅供了解:

{
    "content": [ {
        "price": 499.00,
        "description": "Apple tablet device",
        "name": "iPad",
        "links": [ {
            "rel": "self",
            "href": "http://localhost:8080/product/1"
        } ],
        "attributes": {
            "connector": "socket"
        }
    }, {
        "price": 49.00,
        "description": "Dock for iPhone/iPad",
        "name": "Dock",
        "links": [ {
            "rel": "self",
            "href": "http://localhost:8080/product/3"
        } ],
        "attributes": {
            "connector": "plug"
        }
    } ],
    "links": [ {
        "rel": "product.search",
        "href": "http://localhost:8080/product/search"
    } ]
}

转自:https://github.com/crifan/http_restful_api...

4年前 评论
Summer

什么是HATEOAS

或者说:

  • 为何会有HATEOAS
  • HATEOAS有什么好处或作用?

找个例子来比喻,就容易理解了:

举例解释HATEOAS

比如有个用户的对象,或者说资源,定义是:

class Customer {
    String name;
}

而普通的RESTGET后返回的信息是:

{
    "name" : "Alice"
}

而简单点的HATEOAS则返回是:

{
    "name": "Alice",
    "links": [ {
        "rel": "self",
        "href": "http://localhost:8080/customer/1"
    } ]
}

好处是:

客户端,不需要再去问提供了接口的服务器端,就可以通过此HATEOAS返回的信息中知道一些额外的信息:

  • rel: 表示relationship关系。此处的self指的是就是对象Customer自己本身。
    • 而更加复杂点的情况中,可能会包含其他的对象,比如"rel":"customer"
  • href:当前对象的完整的url地址。

由此可以看出:

如果后台接口支持,或者说实现了HATEOAS这套标准(规范),那么:

调用接口的前端(移动端等),就可以像:

用户通过点击页面的href的链接地址,而跳转到其他网页,实现浏览网页的过程了。

-> 让调用REST的api就可以实现,类似于用户浏览网页的从一个页面跳转到另外一个页面的过程了

-> 而这种超链接方式的api用于告诉用户:该资源的只允许哪些操作(比如GET,POST),以及不允许哪些操作(比如DELETE

-> 从而达到方便用户更加清楚使用你的接口的目的

另外,再贴出来一个复杂点的HATEOAS的例子,仅供了解:

{
    "content": [ {
        "price": 499.00,
        "description": "Apple tablet device",
        "name": "iPad",
        "links": [ {
            "rel": "self",
            "href": "http://localhost:8080/product/1"
        } ],
        "attributes": {
            "connector": "socket"
        }
    }, {
        "price": 49.00,
        "description": "Dock for iPhone/iPad",
        "name": "Dock",
        "links": [ {
            "rel": "self",
            "href": "http://localhost:8080/product/3"
        } ],
        "attributes": {
            "connector": "plug"
        }
    } ],
    "links": [ {
        "rel": "product.search",
        "href": "http://localhost:8080/product/search"
    } ]
}

转自:https://github.com/crifan/http_restful_api...

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!