我正在使用MVC编写我的第一个Web API。
我知道POST和PUT通常用于定义用于在API后面插入或更新数据库的HTTP方法。但我想要做的就是从调用者接收一个JSON对象,做一些处理然后返回另一个JSON对象作为响应。不涉及数据库。
我已经在我的API控制器方法中使用POST和GET进行了测试,它们都运行正常但我应该使用哪种http方法进行最佳实践?
例如
public IHttpActionResult Get(ApiEquipment equipment)
{
// Convert equipment to a compatible buffer
return Ok(new ConvertToBuffer(equipment));
}
答案 0 :(得分:2)
GET对于SAFE(*)操作非常有用,您无需将许多参数传递给服务器 - 所有参数都必须位于URL中,因为GET操作不会传递HTTP正文中的数据。
POST对于需要将大量数据传递到服务器的UNSAFE(*)操作或操作非常有用,因为数据可以在HTTP正文中传递。
使用GET进行简单的查询和几个参数的计算。对大型有效负载或更改服务器状态的操作(例如更新某些内容或执行复杂的业务操作)使用POST。
有关更深入的信息,请参阅HTTP method definitions in RFC 7231。
(*)SAFE操作是不改变(可见)服务器状态的操作。 UNSAFE操作确实改变了(可见的)服务器状态。
答案 1 :(得分:1)
circleLayer
您似乎只想从原始数据(来自调用者的请求)中以有意义的表示形式(处理后的响应)检索数据。
没有修改/插入数据,因此应使用GET
。
答案 2 :(得分:1)
POST
动词似乎就是你想要的。
如果我理解正确,您希望从客户端向服务器发送JSON。然后服务器将修改JSON并将其返回给客户端。
在REST API中,POST
通常用于创建新资源。但对于不应使用其他方法执行的操作,它也是 catch-all动词。
答案 3 :(得分:1)
我建议您使用' HTTPPOST'如果您需要处理JSON对象,请使用GET
方法。
考虑使用HttpPost
方法的这个例子,因为我处理JSON对象以从数据库中获取一些信息。
[HttpPost]
public IHttpActionResult Masters([FromBody]Download_Config_UserInfo Info)
{
List<TestMaster> testMaster = null;
ResponseValidation objValidation = new ResponseValidation();
try
{
#region Validation
objValidation = base.ValidateRequest(Info);
if (!objValidation.isValid)
return base.JsonErrorResult(this.MasterName, objValidation.ErrorCode, objValidation.ErrorDesc);
#endregion
#region Initialization
this.Initialization();
#endregion
#region Functionality
//testMaster = this.GetTestMaster();
testMaster = this.GetTestDateMaster();
if (testMaster == null)
return base.JsonErrorResult(this.MasterName, "E19", "Data Not Available");
var result = (from a in testMaster
select new object[]
{
a.TestId,
a.TestName
});
#endregion
return base.JsonResult(this.MasterName, this.Fields, result);
}
catch (Exception ex)
{
loggerService.Error(Info.ToJSON(), this.MasterName, ex);
return base.JsonErrorResult(this.MasterName, "E20", "Internal Server Error", ex.Message + "_" + ex.StackTrace);
}
finally
{
testMaster = null; objValidation = null; base.UserMaster = null; base.UserPositionMapping = null;
}
}
#endregion
#region Functionality
[NonAction]
public List<TestMaster> GetTestMaster()
{
List<ADM_Retailer> testMaster = null;
try
{
testMaster = this.GetTest();
if (testMaster == null || (testMaster.Count == 0)) { return null; }
string weekNo = base.GetWeekNumber();
return (from a in testMaster
select new TestMaster
{
TestId = a.ARTR_Id,
TestName = a.ARTR_Name,
}).ToList();
}
finally { }
}