c# - 当查询字符串太复杂时,我们可以使用 HttpPost 代替 HttpGet 吗?

标签 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

最佳答案

简而言之,尽可能遵循最佳实践,但不要拘泥于此。看来您有一个使用 POST 的有效用例。 “真正的 RESTful”主要取决于对几个竞争标准的解释(http 客户端和服务器稍有不同等)。

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

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

public IHttpActionResult Employees([FromBody]SearchBindingModel searchOptions)

关于c# - 当查询字符串太复杂时,我们可以使用 HttpPost 代替 HttpGet 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33640253/

相关文章:

logging - 如何启用 Web API 响应跟踪?

c# - 如何使用 dailymotion api 为视频上传设置自定义缩略图

C# 控制台 : How to make the console stop scrolling automatically?

javascript - Ajax.ActionLink 值丢失

c# - 是否可以在 Web api 路由中使用 .json?

c# - 是否可以在 ODataController 中返回不同的模型?

c# - 日期中的月份无效 - Informix 中的日期格式偶尔会恢复

c# - 程序集版本 ".001"变为 ".1"

c# - ASP.NET Core 2.0 Identity - 密码错误消息未显示在 View 中

c# - ToString 错误在 C# 中没有采用一个参数的方法