当需要其他参数时,如何正确使用Web API / Rest

时间:2014-02-11 14:24:45

标签: c# asp.net .net rest asp.net-web-api

我是WebAPI的新手并且正在努力做正确的事情。默认情况下,如果我要访问用户之类的东西,如果我想要用户5,我会调用api / user / 5.这样我的用户控制器就会得到Get(int num)。但我知道我经常需要传递其他参数。目前我有Get(JObject数据),但该数据参数用于其他参数。我将需要其他可选参数,无论我是发送ID还是想要列出所有内容。如何使用WebAPI正确组织方法?我误解了什么吗?

澄清: 这个问题更多的是关于REST而不是动态对象,尽管它们起了作用:

当我需要额外的参数时,如何获得单个资源与资源列表。我认为这些概念是两种不同的方法,但是当涉及到路由时,额外的参数在我的脑海中使它复杂化。

3 个答案:

答案 0 :(得分:1)

使用JToken或更动态的“动态”(Taken from here

” JSON和JavaScript实际上是动态的,并且通常尝试将真正动态的JSON对象“反序列化”为强类型的.NET结构是一件麻烦事。 JSON.NET和ASP.NET Web API的模型绑定提供了一个快乐的媒介 - 一个中间立场 - 称为JToken。

public class ContactController : ApiController
{
    public JToken Post(JToken contact)
    {
        return contact;
    }
}

使用JToken提供动态容器,但也提供类似DOM的导航模型。但是,如果这对我来说不够动态,为什么我的方法的参数不能只是采取“动态”。

C#是静态类型的,当然,但这并不意味着我无法静态输入动态的东西。 ;)

再次注意观察窗口。

使用dynamic捕获JSON post payload

public class ContactController : ApiController
{
    public dynamic Post(dynamic contact)
    {
        return contact;
    }
}

答案 1 :(得分:1)

使用attribute routing

例如 -

[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

[Route("customers/{customerId}/orders/{orderId}")]
public Order GetOrderByCustomer(int customerId, int orderId) { ... }

如果需要返回列表,请创建一个返回列表的方法,否则返回请求的特定项

答案 2 :(得分:0)

我认为你应该为每个将处理请求的WebAPI函数创建一个新对象。您可以使用可为空的属性使参数可选。

[HttpPost]
public void SampleFunction(SampleFunctionModel model)
{

}

其中SampleFunctionModel为:

public class SampleFunctionModel
{
    public int? Id { get; set; }

    public string Name { get; set; }
}