【问题标题】:GET,POST,PUT Which should be used for receiving a json object to my rest api and send a json object in response?GET,POST,PUT 哪个应该用于将 json 对象接收到我的 rest api 并发送 json 对象作为响应?
【发布时间】:2016-05-12 07:57:14
【问题描述】:

我正在使用 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));
}

【问题讨论】:

  • POST 是一个 catch all 动词。
  • 什么意思?
  • @Czeshirecat 只是为了澄清:您是从客户端向服务器发送 JSON。然后服务器将修改 JSON 并将其返回给客户端。是这个意思吗?
  • @Borjante 我的意思是POST HTTP 动词可用于任何其他 HTTP 动词不适合的任意处理。
  • @Borjante 查看this answer 了解更多详情。

标签: json api rest http


【解决方案1】:

GET 对于不需要向服务器传递许多参数的 SAFE(*) 操作很有用 - 所有参数都必须在 URL 中,因为 GET 操作不会在 HTTP 正文中传递数据。

POST 对于 UNSAFE(*) 操作或需要将大量数据传递到服务器的操作很有用,因为数据可以在 HTTP 正文中传递。

使用 GET 进行带有少量参数的简单查询和计算。将 POST 用于大型负载或更改服务器状态的操作(例如更新某些内容或执行复杂的业务操作)。

有关更多详细信息,请参阅HTTP method definitions in RFC 7231。

(*) SAFE 操作是不改变(可见)服务器状态的操作。 UNSAFE 操作确实会改变(可见的)服务器状态。

【讨论】:

    【解决方案2】:

    GET

    您似乎只想从原始数据(来自调用者的请求)中以有意义的表示形式(处理后的响应)检索数据。 没有修改/插入数据,所以应该使用GET。

    【讨论】:

      【解决方案3】:

      POST 动词似乎就是你想要的。

      如果我理解正确,您希望将 JSON 从客户端发送到服务器。然后服务端会修改JSON并返回给客户端。

      在 REST API 中,POST 通常用于创建新资源。但对于不应使用其他方法执行的操作,它也是一个包罗万象的动词。

      有关使用POST 调用任意处理的更多详细信息,请查看此answer。

      【讨论】:

        【解决方案4】:

        如果您需要处理 JSON 对象,我建议您使用“HTTPPOST”,否则请使用GETmethod。

        考虑使用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 { }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-14
          • 2021-05-10
          • 1970-01-01
          • 2017-02-10
          相关资源
          最近更新 更多