当查询字符串过于复杂时,我们可以使用HttpPost而不是HttpGet吗?

时间:2015-11-10 21:48:06

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

我有一个Asp.Net Web API,其功能如下

[HttpPost]
[Route("Employees")]
public IHttpActionResult Employees(SearchBindingModel searchOptions)
{
   ...
}

它是搜索员工的功能,因此它应该是HttpGet而不是HttpPost。问题是SearchBindingModel非常复杂,我不知道如何将其写为查询字符串。

班级看起来像这样

public class SearchBindingModel
{
    public IList<Criteria> Criterias { get; set; }
}


public class Criteria
{
   ...
}



public class FooCriteria : Criteria
{
   ...
}



public class BarCriteria : Criteria
{
   ... 
}

由于查询字符串不能包含层次结构,我应该重新考虑我的Web API吗?

或者我应该继续使用HttpPost吗?

1 个答案:

答案 0 :(得分:1)

简而言之,请尽可能遵循最佳实践,但不要挂断它。您似乎拥有使用POST的有效用例。真正的RESTful&#39;主要是为了解释几个竞争标准(http客户端和服务器,这些标准稍有不同等)。

对于复杂的大型模型,有时使用GET是不切实际的,这取决于您的API的消费者(通过浏览器或不通过浏览器),您可能需要考虑查询字符串的浏览器URL长度限制,如上所述https://stackoverflow.com/a/417184/1422377如果您要传递复杂模型的列表,这一点尤其重要。

或者,如果你真的必须使用GET,WEB API将接受来自Body的模型,如下面的示例所示。但是,我建议谨慎使用,因为某些客户端将无法向get请求发送正文(例如,如果您的客户端是.net,则必须使用RestSharp lib而不是本机库)。

public IHttpActionResult Employees([FromBody]SearchBindingModel searchOptions)