【问题标题】:How do I use WebAPI/Rest correctly when other params are needed需要其他参数时如何正确使用 WebAPI/Rest
【发布时间】:2014-02-11 14:24:44
【问题描述】:

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

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

当我需要其他参数时,如何获取单个资源与资源列表。我将这些概念视为两个独立的方法,但在涉及路由时,额外的参数在我的脑海中使其复杂化。

【问题讨论】:

  • 你在用 MVC 编码吗?
  • 并非如此。它是一个在客户端带有 MVC 的 JavaScript 应用程序。我想通过 REST 从服务器获取数据,所以我使用的是 WebAPI。我想我可以也可能会在服务器上使用模型,但是有些调用将具有非常动态的参数,我宁愿在 JObject 之类的东西中捕获这些参数,而不是预定义的模型。
  • 我应该补充一点,我是 Microsoft 世界的新手。我来自 LAMP 背景,所以我很容易忽略在这种环境中做事的正确方法。
  • 你在问如何在C#中做可选参数吗? msdn.microsoft.com/en-us/library/dd264739.aspx
  • 更多的是关于 REST 以及针对特定资源的方法和针对资源列表的方法。在这两种情况下都需要额外的参数让我感到困惑。我希望它们被路由到正确的方法,但由于它会自动将它们放在一个对象中,我不知道如何处理它。抱歉,如果我无法解释我想要做什么。

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


【解决方案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】:

    考虑使用 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# 是静态类型的,当然,但这并不意味着我不能静态类型动态的东西。 ;)

    再次注意观察窗口。

    使用动态捕获 JSON 后负载

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

    "

    【讨论】:

    • 我确实觉得这很有帮助,但这实际上只是我试图询问的一部分。我更新了我的问题以帮助澄清我的意思。
    【解决方案3】:

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

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

    SampleFunctionModel 在哪里:

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

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2020-08-24
      • 2016-02-05
      • 1970-01-01
      相关资源
      最近更新 更多