如何通过 restful api 传入部分对象 (json)
How to pass in part of object(json) by restful api
现在,我有一个具有三个必需属性的用户对象:
{名,
姓,
创建时间
}.
现在我开发了一个API来创建用户。我想使用 POST /api/users.
我应该传入 Jason 数据,它包含我想要的数据 post。
如果我传入 {FirstName=abc, LastName=abc, CreatedTime=sometime},它可以工作,但如果我错过任何属性,比如只传入 {firstname=abc},它会抛出异常。
我在下面粘贴了我的方法。
[Route("api/users")]
public User CreateUser(User user)
{
if (!ModelState.IsValid)
throw new HttpResponseException(HttpStatusCode.BadRequest);
user.FirstName = String.IsNullOrEmpty(user.FirstName) ? "Undefined" : user.FirstName;
user.LastName = String.IsNullOrEmpty(user.LastName) ? "Undefined" : user.LastName;
user.UserName = String.IsNullOrEmpty(user.UserName) ? "Undefined" : user.UserName;
user.ModifiedAt = DateTime.Now;
user.CreatedAt = DateTime.Now;
_context.Users.Add(user);
_context.SaveChanges();
return user;
}
我的问题是:有什么方法可以传递用户的部分属性吗?比如{firstname=abc}.
此技术也可用作 PUT(更新用户方法)。
提前致谢。
这取决于您的属性数据类型,如果它们可以为空,那么您可以在发送消息中将它们留空或为空,但如果它们不可为空,您必须提供值,否则您会在目的地(您的wep-api 行动)。
所以现在如果你想避免为不可为空的属性传递值,你可以在你的属性上使用 [JsonIgnore]
属性(属于 Newtonsoft.Json
)。像这样:
using Newtonsoft.Json;
public class User
{
//...
[JsonIgnore]
public DateTime CreatedAt { get; set; }
//...
}
1) 插入记录时只需将 CreatedAt
和 ModifiedAt
属性 标记为 [JsonIgnore]
属性
[Required]
[JsonIgnore]
public DateTime CreatedAt { get; set; }
[Required]
[JsonIgnore]
public DateTime ModifiedAt { get; set; }
2) 当您尝试获取数据时,您的 api 方法将是
[HttpGet]
[Route("ById/{id=id}")]
public IHttpActionResult GetUser(int? id)
{
if (id == null)
return NotFound();
User user = _context.Users.SingleOrDefault(c => c.UserId == id.Value);
if (user == null)
return BadRequest("User not exist in our database");
var returnedData = new { FirstName = user.FirstName, LastName = user.LastName, UserName = user.UserName, CreatedAt = DateTime.Now, ModifiedAt = DateTime.Now };
return Ok(returnedData);
}
我们只使用可自定义为return数据的returnAnonymous Type
。
试一次对你有帮助
现在,我有一个具有三个必需属性的用户对象: {名, 姓, 创建时间 }.
现在我开发了一个API来创建用户。我想使用 POST /api/users.
我应该传入 Jason 数据,它包含我想要的数据 post。
如果我传入 {FirstName=abc, LastName=abc, CreatedTime=sometime},它可以工作,但如果我错过任何属性,比如只传入 {firstname=abc},它会抛出异常。
我在下面粘贴了我的方法。
[Route("api/users")]
public User CreateUser(User user)
{
if (!ModelState.IsValid)
throw new HttpResponseException(HttpStatusCode.BadRequest);
user.FirstName = String.IsNullOrEmpty(user.FirstName) ? "Undefined" : user.FirstName;
user.LastName = String.IsNullOrEmpty(user.LastName) ? "Undefined" : user.LastName;
user.UserName = String.IsNullOrEmpty(user.UserName) ? "Undefined" : user.UserName;
user.ModifiedAt = DateTime.Now;
user.CreatedAt = DateTime.Now;
_context.Users.Add(user);
_context.SaveChanges();
return user;
}
我的问题是:有什么方法可以传递用户的部分属性吗?比如{firstname=abc}.
此技术也可用作 PUT(更新用户方法)。
提前致谢。
这取决于您的属性数据类型,如果它们可以为空,那么您可以在发送消息中将它们留空或为空,但如果它们不可为空,您必须提供值,否则您会在目的地(您的wep-api 行动)。
所以现在如果你想避免为不可为空的属性传递值,你可以在你的属性上使用 [JsonIgnore]
属性(属于 Newtonsoft.Json
)。像这样:
using Newtonsoft.Json;
public class User
{
//...
[JsonIgnore]
public DateTime CreatedAt { get; set; }
//...
}
1) 插入记录时只需将 CreatedAt
和 ModifiedAt
属性 标记为 [JsonIgnore]
属性
[Required]
[JsonIgnore]
public DateTime CreatedAt { get; set; }
[Required]
[JsonIgnore]
public DateTime ModifiedAt { get; set; }
2) 当您尝试获取数据时,您的 api 方法将是
[HttpGet]
[Route("ById/{id=id}")]
public IHttpActionResult GetUser(int? id)
{
if (id == null)
return NotFound();
User user = _context.Users.SingleOrDefault(c => c.UserId == id.Value);
if (user == null)
return BadRequest("User not exist in our database");
var returnedData = new { FirstName = user.FirstName, LastName = user.LastName, UserName = user.UserName, CreatedAt = DateTime.Now, ModifiedAt = DateTime.Now };
return Ok(returnedData);
}
我们只使用可自定义为return数据的returnAnonymous Type
。
试一次对你有帮助