【问题标题】:Web API - Accepting array urlencoded parametersWeb API - 接受数组 urlencoded 参数
【发布时间】:2018-05-29 04:39:26
【问题描述】:

我已经构建了一个 90% 功能的 Web API。我遇到的问题是如何使用 Web API 接受 jQuery 样式数组编码的参数。这是我的 GET 请求:

GET /api/v1/Trades?take=3&skip=0&page=1&pageSize=3&sort%5B0%5D%5Bfield%5D=tradeName&sort%5B0%5D%5Bdir%5D=asc

未编码,请求如下所示:

GET /api/v1/Trades?take=3&skip=0&page=1&pageSize=3&sort[0][field‌​]=tradeName&sort[0][‌​dir]=asc

这种风格与 jQuery 的 $.param 方法序列化请求的方式是一致的。我如何接受它作为 Web API 中的参数?我尝试了以下方法:

[System.Web.Http.HttpGet]
[System.Web.Http.Route("api/v1/Trades")]
public IHttpActionResult GetTrades(int page = -1, int pageSize = -1, int skip = -1, int take = -1, string[,] sort = null)
{
    // Do stuff ...
}

在这种情况下,我的方法收到 500 错误并显示以下消息:

“FormatterParameterBinding”不支持可选参数“sort”。

我也试过这个:

public IHttpActionResult GetTrades(string[,] sort, int page = -1, int pageSize = -1, int skip = -1, int take = -1)
{
    // Do stuff ...
}

使用这个,我的方法被调用,但排序总是null。我也尝试过更通用的方法,如下所示:

public IHttpActionResult GetTrades(object sort, int page = -1, int pageSize = -1, int skip = -1, int take = -1)
{
    // Do stuff ...
}

再一次,我的方法被调用了,但排序总是null

任何建议都会有所帮助!

【问题讨论】:

  • @CaiusJard - 这不一样。我没有尝试传入多维数组,也没有尝试将其传递给 MVC 控制器。我正在尝试传入一个不同的 jQuery 样式数组。您发布的副本中的解决方案对我不起作用。另外,我不想将它传递给 MVC 控制器。我正在尝试将其传递给 Web API 控制器。
  • 您坚持认为为 MVC 控制器提供的解决方案无法适应您的情况,因此我撤回了我的赞成票。与 Web API 路由相比,MS 为 MVC 路由实现了一个完全不同的解析例程,这仍然让我感到惊讶。但显然你已经尝试过了,但它没有成功!感谢您的反馈
  • @Div - 完全不同的问题。您链接的问题是关于如何解析剑道网格中的数据。我试图弄清楚如何从 jQuery .param 方法解析数据。

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


【解决方案1】:

如果您要发送这么多参数,那么最好使用 POST 方法,因为您可以在 Object 中发送数据。

如果你想使用 GET 方法然后使用

[System.Web.Http.HttpGet]
[System.Web.Http.Route("api/v1/Trades")]
public IHttpActionResult GetTrades(int page = -1, int pageSize = -1, int skip = -1, int take = -1, string sort = "")
{
    // Do stuff ...
}

并进行 API 调用

GET /api/v1/Trades?take=3&skip=0&page=1&pageSize=3&sort=tradeName asc,Col2 desc

GetTrades 方法中调用后,将 sort 字符串数据按逗号(,),然后按空格()。所以你会得到列名和排序顺序。

【讨论】:

  • 此解决方案不起作用。 sort 总是返回一个空字符串。另外,关于您对使用 POST 方法的评论,如果您正在创建一个 RESTful API 并且您只是检索数据(而不是修改它),那么将其设为 GET 方法不是标准做法吗?
猜你喜欢
  • 1970-01-01
  • 2021-06-02
  • 2018-08-09
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多