3

对于需要返回资源的“子属性”的基于 asp.net webapi 约定的休息服务,我不确定“最佳实践”的前进方式。

例如:

UsersController

public User Get(int id) { ... } //returns named user via /api/v1/Users/23

但是如果我想返回给定的用户角色集合,我想我想要一个 url/api/v1/Users/23/Roles

如果您使用我的 api,您会认为这是可以接受的吗?

如果可以接受,我的 routeTemplate 和方法签名会是什么样子(对不起,如果这很明显 - 我今天真的很困惑)

我能找到的所有 web api 示例都太简单了,只使用 DELETE、PUT、POST 和两个 GET - 似乎没有一个涵盖像子属性(如上)或部分响应 之类的东西/api/v1/Users/23?fields=id,name- 如果有人知道那里有一个很好的例子棒极了。

非常感谢

4

1 回答 1

2

角色

Roles 看起来是一个非常明智的子资源。

假设您希望使用 http 动词列出和删除用户的角色……那么您可以使用两个控制器,一个用于用户,另一个用于角色。您的路线将如下所示:

config.Routes.MapHttpRoute(
            name: "UserApi",
            routeTemplate: "api/v1/Users/{userId}/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/v1/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

然后,您的角色控制器将具有以下方法:

public class RolesController : ApiController
{
    // GET api/v1/users/1/roles
    public IEnumerable<Role> Get(int userId)
    {
        //
    }

    // GET api/v1/users/1/roles/1
    public IEnumerable<Role> Get(int userId, int id)
    {
        //
    }

}

角色作为用户的部分响应

对于请求使用什么格式和标准:

apigee 在他们的网站上制作了一本免费的电子书,他们在其中提出设计建议和对现有 API 的观察。

他们描述了来自 LinkedIn、Facebook 和 Google 的部分响应示例。在他们的博客之一和他们书中都有介绍。

如何使用 WebApi ASP.NET

假设使用 JSON 作为内容类型,那么在ASP.NET Web API 部分响应 Json 序列化之前已经问过一个类似的问题,简而言之,您需要将“?Fields =”之类的查询参数传递给自定义ContractResolver.

于 2013-02-08T14:35:39.307 回答