相同 API 但不同方法(GET 和 POST)的不同响应

Different response for same API but different method (GET and POST)

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

据我所知,POST方法用于向服务器发送数据,在消息体中带有请求参数,以确保安全。而GET方法是在URL中获取带参数的数据。 但我不明白的是,同样的 api 仅仅通过改变方法可能会有不同的行为。

这是一个例子。我用的是SoapUI 5.5.0,这个是link的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和date每次都变) 如本 link https://reqres.in/ 中所述,它正在创建一个实例,我们可以添加参数..

但是,任何人都可以解释一下在技术上如何在同一个 URL.

上使用不同的方法实现不同的行为?

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

GET: 检索数据 POST: 使用请求的正文创建一个新实体 PUT: 用请求的正文替换实体 PATCH:用请求的主体更新实体的一些属性。 A.K.A。部分更新

在您的例子中,将动词从 get 更改为 post 会产生创建 ID 为 1 的新实体的效果。这就是为什么您会收到包含新创建的 ID 和 createdAt 时间戳的响应。

how is it technically possible to have different behavior with different methods on the same URL

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

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

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

In my knowledge, the POST method is used to send data to the server with request parameter in message body to make it secure. And GET method is to retrieve data with parameters in the URL.

这可能会妨碍您。

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

开头
method SP request-target SP HTTP-version CRLF

The request-target identifies the target resource upon which to apply the request

The method token indicates the request method to be performed on the target resource.

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

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

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

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

But what I didn't understand is how the same api may have different behavior by just changing the method.

与 api 只需更改请求目标即可表现出不同行为的方式相同。

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

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