Разный ответ для одного и того же API, но разный метод (GET и POST) - PullRequest
1 голос
/ 27 февраля 2020

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

Насколько мне известно, метод 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"
}

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

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

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

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

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

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

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

1 голос
/ 28 февраля 2020

Насколько мне известно, метод 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) логика ветвления c обеспечивается кодом платформы; Ваши обработчики на заказ должны быть только правильно зарегистрированы, и инфраструктура гарантирует, что каждый запрос будет перенаправлен на правильный обработчик.

0 голосов
/ 27 февраля 2020

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

GET: получение данных POST: создание нового объекта с телом запроса PUT: замена объекта на тело запроса PATCH: Обновить некоторые свойства объекта с помощью тела запроса. Частичное обновление AKA

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

...