【发布时间】:2017-07-13 22:14:56
【问题描述】:
我有一个接收字符串的简单 httpGet 端点
[Authorize]
[HttpGet("filter/{filters}"), Route("filter")]
public virtual IActionResult Filter(string filters)
{
try
{
return Ok(Service.GetByFilter(JsonConvert.DeserializeObject<FilterHelper>(filters)));
}
catch (Exception ex)
{
Logger.LogWarning(LoggingEvents.GET_ENTITY_BY_FILTER, ex, Localizer["EntityGetFilterFailed"]);
return Ok(new RequestResult(StatusResult.Danger, new Message(string.Format(Localizer["UnexpectedError"], LoggingEvents.GET_ENTITY_BY_FILTER))));
}
}
昨天,它工作正常,今天我的电脑在启动时失败并已恢复,之后我的 API 给了我错误的请求结果。
如果我调用这个网址
http://localhost:23272/api/users/filter?filters={"Page":1,"PageSize":5}
请求正确,但如果我尝试调用此 url(之前有效)
http://localhost:23272/api/users/filter?filters={"Page":1,"PageSize":5, "FilterItens": []}
API 向我返回一个 BadRequest 状态 (400)。已经尝试使用一些iten 传递数组,也有错误的请求。
关于如何处理的任何想法?
详细信息:如果我从邮递员那里打电话,它工作正常。
http://localhost:23272/api/users/filter?filters={"Page":1,"PageSize":5, "FilterItens": []}
我的模型
public class FilterHelper
{
#region Properties
public int Page { get; set; }
public int PageSize { get; set; }
public ICollection<FilterItem> FilterItens { get; set; }
public string[] Includes { get; set; }
#endregion
}
【问题讨论】:
-
由于您没有显示您的模型,因此您更可能有错字 =>
FilterItens可能应该是FilterItems。但请注意,HTTP 没有“数组”的概念,它仅由服务器解释。即?q=1&q=2只是作为 2 个 q 值发送。它不是一个数组。?q[]=1&q[]=2也一样。只有服务器(即 PHP、.NET、ASP.NET、python、ruby)解释如何处理这个值:?q=1&q=2可以被视为“只取最后一个”或“只取第一个”或“将多个值视为数组” ”。使用的框架决定,不是 HTTP 规范 -
这不是一个错字,我将模型作为“字符串”接收,api 在转换之前返回了该错误。用我的模型编辑
-
@Tseng 我正在尝试将 "{"Page":1,"PageSize":5, "FilterItens": []}" 作为字符串发送到我的 API,然后在服务器。如果我用邮递员发送,它可以正常工作,如果我用角度发送,它会坏
-
首先,查看更新后的评论。其次,只要有
=、&或?,将这样的数据传递给控制器就会失败,因为&被视为参数分隔符,=被视为参数分配。如果您将参数传递给查询,您总是必须转义它们,尤其是&和=但是我可以从 Firefox 窗口(在 ASP.NET 中通过Uri.EscapeDataString(...)。不知道JS 或者如果它在那里也正确转义,您必须查看原始请求而不是 FF 视图 -
我不会在字符串中包含
=,而且,我很伤心,如果我通过邮递员发出 get 它工作正常,我只是不知道为什么它不工作来自我的应用
标签: asp.net-core asp.net-core-webapi