Разный ответ для одного и того же API, но другой метод (GET и POST)

Я думаю, что это классический и типичный вопрос, но я не нашел на него ответа.

Насколько мне известно, метод POST используется для отправки данных на сервер с параметром запроса в теле сообщения, чтобы сделать его безопасным. А метод GET предназначен для получения данных с параметрами в URL. Но чего я не понял, так это того, как один и тот же API может вести себя по-разному, просто изменив метод.

Вот пример. Я использую SoapUI 5.5.0, это ссылка API: https://reqres.in/api/users/1

когда я использую метод GET, я получаю следующее:

{
  "data": {
    "id": 1,
    "email": "[email protected]",
    "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"
}

(идентификатор и дата меняются каждый раз), как описано в этой ссылке https://reqres.in/, что это создание экземпляра, и мы можем добавить параметры..

НО, может ли кто-нибудь объяснить, как технически возможно иметь различное поведение с разными методами на одном и том же URL-адресе.


person Bashir    schedule 27.02.2020    source источник
comment
Если вы знакомы с шаблоном 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> — для отображения одной записи. Это два разных контроллера.   -  person KSD Putra    schedule 28.02.2020


Ответы (3)


Насколько мне известно, метод POST используется для отправки данных на сервер с параметром запроса в теле сообщения, чтобы сделать его безопасным. А метод GET заключается в получении данных с параметрами в URL-адресе.

Это, вероятно, мешает вам.

HTTP-запросы — это сообщения; каждое сообщение начинается с строки запроса.

method SP request-target SP HTTP-version CRLF

Цель запроса идентифицирует целевой ресурс, к которому применяется запрос.

Маркер метода указывает метод запроса, который должен быть выполнен на целевом ресурсе.

Вы можете думать об этом как о вызове функции

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

Или, что то же самое, вы можете думать о ресурсах как об объектах, которые разделяют понимание семантики сообщений.

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

Но чего я не понял, так это того, как один и тот же API может вести себя по-разному, просто изменив метод.

Точно так же API может вести себя иначе, просто изменив цель запроса.

В HTTP строка запроса представляет собой буквально удобочитаемый текст, который будет анализировать сервер. Проанализировав строку запроса, серверная программа может перейти к любому коду, который она хочет использовать для выполнения работы, на основе значений, найденных в сообщении.

Во многих фреймворках (Spring, Rails) логика ветвления обеспечивается кодом фреймворка; ваши индивидуальные обработчики должны быть только правильно зарегистрированы, а платформа гарантирует, что каждый запрос перенаправляется правильному обработчику.

person VoiceOfUnreason    schedule 28.02.2020

как технически возможно иметь различное поведение с разными методами на одном и том же URL

для технической возможности вы можете посмотреть ответ фреймворка Spring.

У вас может быть контроллер, доступный по одному URL-адресу, но с которым можно связаться по четырем словам: GET, PUT, POST, DELETE. Для этого Spring предоставляет аннотации @GetMapping, @PostMapping, @PutMapping, @DeleteMapping.

Все запросы отправляются на один и тот же URL-адрес, и Spring определяет, какой метод вызывать на основе глагола.

person codebrane    schedule 27.02.2020

В Restful API глаголы имеют очень важное значение.

GET: Получить данные POST: Создать новый объект с телом запроса PUT: Заменить объект телом запроса PATCH: Обновить некоторые свойства объекта телом запроса. А.К.А. Частичное обновление

В вашем случае изменение глагола с get на post приводит к созданию нового объекта с идентификатором 1. Вот почему вы получаете ответ с вновь созданным идентификатором и отметкой времени createdAt.

person Miguel Bernard    schedule 27.02.2020
comment
но в ссылке у меня параметр 1 (для id), то получаю ответ с другим id. и что я до сих пор не понял, так это то, как один и тот же API может иметь разные методы. что я знаю, так это то, что у API есть один метод. (Я все еще открываю для себя мир Restful API) Я даже не могу найти пример разработки одного API с более чем одним методом. - person Bashir; 27.02.2020
comment
В Rest URL-адрес используется для ссылки на ресурс, а HTTP-глагол определяет операцию, которую вы хотите выполнить с этим ресурсом. Таким образом, 1 URL-адрес может представлять несколько методов сервера. - person Miguel Bernard; 27.02.2020