【问题标题】:Different response for same API but different method (GET and POST)相同 API 的不同响应但不同的方法(GET 和 POST)
【发布时间】:2020-06-11 14:44:42
【问题描述】:

我认为这是一个经典而典型的问题,但我没有找到答案。

据我所知,POST 方法用于将数据发送到服务器,消息正文中带有请求参数,以使其安全。而 GET 方法是通过 URL 中的参数来检索数据。 但是我不明白的是,同一个api怎么可能通过改变方法有不同的行为。

这是一个例子。我用的是SoapUI 5.5.0,这个是api的链接:https://reqres.in/api/users/1

当我使用 GET 方法时,我得到了这个:

{
  "data": {
    "id": 1,
    "email": "george.bluth@reqres.in",
    "first_name": "George",
    "last_name": "Bluth",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg"
  }
}

通过仅将方法更改为 POST,我得到了这个:

{
   "id": "244",
   "createdAt": "2020-02-27T14:30:32.100Z"
}

(id和日期每次都会改变) 如此链接https://reqres.in/ 中所述,它正在创建一个实例,我们可以添加参数..

但是,任何人都可以解释在技术上如何在同一个 URL 上使用不同的方法产生不同的行为。

【问题讨论】:

  • 如果您熟悉MVC模式,我可以很容易地解释它。 POST https://reqres.in/api/users 是一位控制器; GET https://reqres.in/api/users 是另一个控制器。它们是两个不同的控制器,尽管它们共享相同的地址。通常,GET https://reqres.in/api/users 用于索引(所有记录),GET https://reqres.in/api/users/<id> 用于显示一条记录。两者都是两个不同的控制器。

标签: rest web-services post get http-method


【解决方案1】:

据我所知,POST 方法用于通过消息正文中的请求参数将数据发送到服务器以使其安全。而GET方法是通过URL中的参数来获取数据。

这可能会妨碍你。

HTTP 请求是消息;每条消息都以request-line开头

method SP request-target SP HTTP-version CRLF

request-target 标识应用请求的目标资源

方法标记表示要对目标资源执行的请求方法。

你可以把它想象成一个函数调用

GET(target-resource)
POST(target-resource, message-body)

或者等效地,您可以将资源视为共享对消息语义的理解的对象

target-resource.GET()
target-resource.POST(message-body)

但我不明白的是,同一个api如何通过改变方法而产生不同的行为。

同一个 API 可以通过改变请求目标来表现不同的行为。

在 HTTP 中,请求行实际上是服务器将解析的人类可读文本。解析完请求行后,服务器程序可以根据它在消息中找到的值分支到它想要用来完成工作的任何代码。

在许多框架(Spring、Rails)中,分支逻辑由框架代码提供;您的定制处理程序只需要正确注册,框架确保每个请求都转发到正确的处理程序。

【讨论】:

    【解决方案2】:

    如何在技术上实现不同的行为 同一个 URL 的不同方法

    技术上的可能性可以看spring框架的answer to this

    您可以拥有一个可通过单个 url 访问的控制器,但可以通过四种方式联系到,GETPUTPOSTDELETE。为此,Spring 提供了注解@GetMapping@PostMapping@PutMapping@DeleteMapping

    所有请求都发送到同一个 url,Spring 根据动词计算出调用哪个方法。

    【讨论】:

      【解决方案3】:

      在 Restful API 中,动词具有非常重要的意义。

      GET: 检索数据 POST:使用请求的正文创建一个新实体 PUT:将实体替换为请求的正文 PATCH:使用请求的正文更新实体的某些属性。又名部分更新

      在您的情况下,将动词从 get 更改为 post 具有创建 ID 为 1 的新实体的效果。这就是为什么您会收到带有新创建的 ID 和 createdAt 时间戳的响应。

      【讨论】:

      • 但在链接中我有参数 1 (for the id) ,然后我得到另一个 id 的响应。而我仍然不明白的是,同一个 API 可能有不同的方法。我所知道的是api有一种方法。 (我仍在探索 Restful API 的世界)我什至找不到使用多个方法开发单个 API 的示例
      • 在 Rest 中,Url 用于引用资源,HTTP 动词指示您要对该资源执行的操作。因此,1 个 Url 可能代表多个服务器方法。
      猜你喜欢
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      相关资源
      最近更新 更多