数据传输对象的RESTful API响应

数据传输对象的RESTful API响应,rest,httpresponse,dto,Rest,Httpresponse,Dto,我的应用程序中有以下场景。我以用户身份登录,并创建了一个组。有一个RESTAPI用于创建组POST/groups/api/v1/groups并获取组详细信息GET/groups/api/v1/groups/{group id} 成功返回的响应不仅仅是组资源的json表示。它是一个DTO,包含许多其他信息,以避免多次调用服务器 例如,响应可以包括 例如,可以在组上执行的操作:邀请用户加入组以及每个操作需要点击的相应URL 组中成员的计数 小组最近的活动 会员信息 等 目前唯一使用RESTAPI的客

我的应用程序中有以下场景。我以用户身份登录,并创建了一个组。有一个RESTAPI用于创建组POST/groups/api/v1/groups并获取组详细信息GET/groups/api/v1/groups/{group id}

成功返回的响应不仅仅是组资源的json表示。它是一个DTO,包含许多其他信息,以避免多次调用服务器

例如,响应可以包括

例如,可以在组上执行的操作:邀请用户加入组以及每个操作需要点击的相应URL

组中成员的计数

小组最近的活动

会员信息

目前唯一使用RESTAPI的客户端是UI,它需要额外的信息。如果API稍后向开发人员公开,他们可能不需要返回所有信息。在必须返回包含更多信息的DTO的情况下,我们如何处理rest响应


在GET的rest响应中返回dto是一种好的设计还是应该避免

如果提供的数据超过要求,可能会被证明是有害的,你需要开始向所有人解释你为什么要提供这么多数据。您可以拥有一个查询参数,该参数对一部分用户是机密的,比如说alldetails=true,这将给出完整的DTO

如果您在REST服务器上使用Java with codehaus或其他JSON实用程序,则可以使用mixin指定要公开的元素。codehaus为此添加了mixin符号


GET的一个好的REST响应应该有一个标识符、所需的详细信息和JSON或XML格式的URL。

好的,提供比所需更多的数据可能是有害的,您需要开始向所有人解释为什么要提供这么多数据。您可以拥有一个查询参数,该参数对一部分用户是机密的,比如说alldetails=true,这将给出完整的DTO

如果您在REST服务器上使用Java with codehaus或其他JSON实用程序,则可以使用mixin指定要公开的元素。codehaus为此添加了mixin符号


GET的一个好的REST响应应该有一个标识符、所需的详细信息和JSON或XML格式的URL。

如果您接受RESTful HTTP是嘈杂的这一事实,这会有所帮助。噪音的设计补偿是缓存,您应该尽可能多地使用缓存来保存服务器命中率。缓存良好的应用程序可以使用多个资源,而不是一个大型资源,因为许多请求永远不会离开客户端

对于您的特定问题,请使用expand query参数确定要包括哪些子对象。您可以进一步指定要包含该子级的哪些属性。比如说,

GET /groups/api/v1/groups/12345
{
    "id": 12345,
    "name": "The Magnificent Seven",
    "location": {
        "self": "/groups/api/v1/locations/43"
    }
}

GET /groups/api/v1/groups/12345?expand=location
{
    "id": 12345,
    "name": "The Magnificent Seven",
    "location": {
        "self": "/groups/api/v1/locations/43",
        "longitude": "24°01′N",
        "latitude": "104°40′W"
    }
}

GET /groups/api/v1/groups/12345?expand=location[latitude]
{
    "id": 12345,
    "name": "The Magnificent Seven",
    "location": {
        "self": "/groups/api/v1/locations/43",
        "latitude": "104°40′W"
    }
}

如果您接受RESTfulHTTP是嘈杂的这一事实,这会有所帮助。噪音的设计补偿是缓存,您应该尽可能多地使用缓存来保存服务器命中率。缓存良好的应用程序可以使用多个资源,而不是一个大型资源,因为许多请求永远不会离开客户端

对于您的特定问题,请使用expand query参数确定要包括哪些子对象。您可以进一步指定要包含该子级的哪些属性。比如说,

GET /groups/api/v1/groups/12345
{
    "id": 12345,
    "name": "The Magnificent Seven",
    "location": {
        "self": "/groups/api/v1/locations/43"
    }
}

GET /groups/api/v1/groups/12345?expand=location
{
    "id": 12345,
    "name": "The Magnificent Seven",
    "location": {
        "self": "/groups/api/v1/locations/43",
        "longitude": "24°01′N",
        "latitude": "104°40′W"
    }
}

GET /groups/api/v1/groups/12345?expand=location[latitude]
{
    "id": 12345,
    "name": "The Magnificent Seven",
    "location": {
        "self": "/groups/api/v1/locations/43",
        "latitude": "104°40′W"
    }
}

您是否有办法锁定角色或允许角色访问特定的api方法?客户端不应该因为被发送了额外数据而中断,理想情况下应该能够处理未获取预期数据的情况,并显示该字段的错误,而不是使整个程序崩溃。如果服务器发送的数据超过了它必须发送的数据量,那么它就是在浪费每个人的时间。请求应详细说明其请求的信息,这可以通过的URI作为请求正文的一部分来完成。是否有方法锁定角色或允许角色访问特定的api方法?客户端不应中断,因为它们被发送了额外的数据,理想情况下,应该能够处理未获取预期数据的情况,并显示该字段的错误,而不是使整个程序崩溃。如果服务器发送的数据超过了它必须发送的数据量,那么它就是在浪费每个人的时间。请求应该详细说明他们所请求的信息,这可以通过的URI作为请求正文的一部分来完成。alldetails=true jut是机密的想法对我来说有点奇怪,如果它起作用或不起作用,应该只是权限问题。我会小心地说一个好的REST响应应该有JSON或XML,数据的格式真的不重要。。。我的回答基于大多数REST实现,这些实现基于HTTP,带有JSON或XML响应。当然,但要明确的是,REST绝对不必是带有JSON或XML的HTTP,它几乎总是这样。alldetails=true jut是机密的想法对我来说有点奇怪,如果它起作用或不起作用,应该只是权限问题。我会小心地说,一个好的REST响应应该有JSON或XML,这是
这些数据真的不重要。你。。。我的答案基于大多数REST实现,这些实现都是基于HTTP的JSON或XML响应。当然,但要明确的是,REST绝对不必是HTTP的JSON或XML响应,它几乎总是这样。这似乎是一个好方法。我在设计RESTful API时发现了类似的最佳实践。这似乎是一个好方法。我在这里设计RESTful API时发现了类似的最佳实践