RESTful API:收集URL应该返回什么?

时间:2015-02-03 16:53:52

标签: rest restful-url

我们说我有一个客户及其订单的数据库。每个客户都有一般信息,如姓名,地址等。每个订单都有购买物品,支付金额等信息。数据库通过RESTful API公开。

据推测,在RESTful API URL上进行GET,如

/customers/101/orders/47/

将被客户101退回订单47的信息(购买物品,支付金额等)。

我还假设在以下网址上有一个GET:

/customers/101/orders/

预计将返回客户101的所有订单信息。

但是,以下网址的GET应该返回什么?

/customers/101/
  • 是否应该由客户101退回所有订单?
  • 它应该只返回客户101的名称,地址等吗?
  • 是否应该通过客户101 返回所有订单的名称,地址等?

我的问题显然是假设有一个正确答案"或推荐的RESTful API URL应返回的最佳实践。

4 个答案:

答案 0 :(得分:1)

我喜欢这个问题。我认为这是非常适合应用的。我的想法只是返回一个匿名对象或特定于该客户的功能的JSON对象及其个人信息(名称和地址)。

通过这种方式,我可以检查他们的授权功能以及他们是谁并使用该信息或验证他们可以做他们想做的事情(假冒廉价安全层可能吗?)...

祝你好运!

答案 1 :(得分:1)

它会返回客户信息。 此URL指向客户资源,因此它应返回客户相关数据。

如果查看GMail REST API,类似的请求可以返回订单ID,例如。

但不是订单信息。

答案 2 :(得分:1)

假设每个客户的订单数量不是很大,我的结构如下:

GET /customers/101
{
    "id": 101,
    "name": "John Smith",
    "orders": [
        "/orders/47",
        "/orders/52"
    ],
    ...
}

GET /orders/47
{
    "id": 47,
    "customer": "/customer/101",
    ...
}

关键点:

  • 不要在URL中嵌套资源
    • 嵌套会妨碍您稍后重组的能力。如果要添加多客户订单会发生什么?
  • 使用URI链接资源

答案 3 :(得分:1)

网址的结构并不是什么使它成为RESTful;相反,你应该以一种易于发现的方式提供一个包含其他数据链接的对象。

所以,如果调用者到目前为止已经完成了GET

/customers 

...您可能希望返回"客户"对象。然后,每个Customer对象将包含指向适当对象的链接及其URI。在您的情况下,每个Customer对象可能都是:

{
    "customer": {
        "id": 101,
        "self": {
            "url": "http://service.yourdomain.com/customers/101",
            "recommended_mediatype": "application/x.yourdomain.customer.v1"
        }
        "orders_list": {
            "url": "http://service.yourdomain.com/customers/101/orders",
            "recommended_mediatype": "application/x.yourdomain.order.v1"
        }
    }
}

这解决了两个问题:

  1. 是否返回订单,只返回地址或两者:客户端可以通过在GET中提供不同的MediaType来决定这一点。上面的Customer对象建议使用 x.yourdomain.order.v1 的MediaType,但您可能支持不同的表示类型(例如) x.yourdomain.order-address.v1 仅包含订单的地址数据。在这方面,您在同一URI端点提供了许多不同的资源表示。

  2. 不预先确定您的URI:通过在父对象(Customer)中嵌入URI,您不会将URI结构暴露给您的客户端;使未来变革更加可行。

  3. 希望有所帮助!