使用HttpClient发布时,为什么我的帖子数据全为空?

时间:2017-12-30 12:16:52

标签: c# asp.net-core .net-core dotnet-httpclient asp.net-core-2.0

我正在尝试将客户端Web应用程序中的对象发布到所述客户端的CRUD API。我使用以下代码来发布帖子请求:

var respP = await _client.PostAsync("api/Persons", new StringContent(JsonConvert.SerializeObject(person), Encoding.UTF8, "application/json"));

API动作方法很简单:

[HttpPost]
public async Task Post(Person person)
{
    _db.Add(person);
    await _db.SaveChangesAsync();
}

我在_db.Add(person);上有一个断点,当它被点击时,我看到Person中有一个非空person实例,但是所有字段都是默认值,即nullables是等等。

我按如下方式设置HttpClient

_client.BaseAddress = _config["Api:Url"];
_client.DefaultRequestHeaders.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

我确实尝试制作person参数类型string以查看是否可以看到原始JSON,但person参数本身也是空的。

我在这里做错了什么?

ADDED:Person类如下所示:

public class Person
{
    [Key]
    public int PersonId { get; set; }

    [Required(AllowEmptyStrings = false)]
    [StringLength(128)]
    public string LastName { get; set; }

    [Required(AllowEmptyStrings = false)]
    [StringLength(128)]
    public string FirstName { get; set; }

    [Column(TypeName = "date")]
    public DateTime BirthDate { get; set; }

    [Required(AllowEmptyStrings = false)]
    [StringLength(13)]
    public string IdNumber { get; set; }
}

并且传递的实际JSON是:

{
  "PersonId": 0,
  "LastName": "df",
  "FirstName": "dfzg",
  "BirthDate": "2017-12-01T00:00:00",
  "IdNumber": "0000000000000"
}

1 个答案:

答案 0 :(得分:0)

您需要明确告诉框架在哪里查找要绑定到模型的传入数据。在参数上使用[FromBody]属性来绑定请求正文中的数据

注意:接受用户输入的操作应检查ModelState.IsValid属性。

[HttpPost]
public async Task<IActionResult> Post([FromBody]Person person) {
    if(ModelState.IsValid) {
        _db.Add(person);
        await _db.SaveChangesAsync();
        return Ok();
    }
    return BadRequest();
}

参考Model Binding