当我从单元测试中调用此API方法时,json
参数具有值。但是当我从Postman那里做的时候,它总是空的。
/// <summary>
/// Save the access integration settings for a given integration.
/// </summary>
/// <param name="json"></param>
/// <param name="integrationID"></param>
/// <returns></returns>
[Route("api/AccessIntegrationSettings/{integrationID}")]
[SwaggerOperation(Tags = new[] { "Access Integration: Integration Settings" })]
public IHttpActionResult Post([FromBody]string json, string integrationID)
{
....
}
这就是我在Postman中所做的事情(图片更容易......)
对于标题,有两个安全标题(这不是问题),也是这个:
Content-Type application/json
我不确定我的方法是否配置不当,或者我的邮差是否错误。但同样,当我从单元测试中点击此方法时,json
参数有一个值,所以我倾向于认为我在Postman中做错了什么,但我不知道是什么。< / p>
更新
我还注意到,如果我验证了ModelState,那么当来自单元测试时它总是true
,而来自Postman的时候总是false
。
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
....
}
}
如果我从每个调用中钻取到ModelState,那么当来自Postman时,有一个额外的键值对,当我来自我的单元测试时不存在:
key: json
value: null
答案 0 :(得分:2)
你应该使用参数绑定,Asp.Net
将反序列化json而不是你。
因此,尝试在动作参数中使用复杂对象。
public class SampleJson
{
public bool IntegrationEnabled { get; set; }
public bool SyncUsers { get; set; }
//etc...
}
另外,为您的操作添加HttpPost
属性。
[HttpPost]
public IHttpActionResult Post(SampleJson jsonObject, [FromUri]string integrationID)
修改强>
如果要处理多种类型,可以像这样合并对象;
public class RootJson
{
public SampleJson SampleJson { get; set; }
public AnotherSampleJson AnotherSampleJson { get; set; }
}
您可以检查该属性的简单空值控件。
注意:请记住,合并复杂对象会更改json。它应该用根括号括起来。