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

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

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

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

使用属性路由

例如 –

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

要么

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

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

考虑使用JToken或更动态的“动态”( 取自此处 )

“虽然JSON和JavaScript非常动态,但尝试将真正动态的JSON对象”反序列化“为强类型的.NET结构通常很麻烦.JSON.NET和ASP.NET Web API的模型绑定提供了一个快乐的媒介 – a中间地带 – 叫做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; } } 

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

 [HttpPost] public void SampleFunction(SampleFunctionModel model) { } 

其中SampleFunctionModel是:

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