为什么来自Postman的“[FromBody]字符串json”为空?

时间:2018-03-12 18:49:03

标签: c# .net api postman

当我从单元测试中调用此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中所做的事情(图片更容易......)

enter image description here

对于标题,有两个安全标题(这不是问题),也是这个:

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

1 个答案:

答案 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。它应该用根括号括起来。