Как правильно обрабатывать несколько методов HTTP с одним URI и одним запросом? - PullRequest
0 голосов
/ 05 января 2019

Я хочу понять, какая должна быть правильная структура запроса / ответа и дизайн API для решения приведенной ниже проблемы. У меня есть 2 сущности, скажем, Abc и Xyz. И у Xyz есть внешний ключ Abc. Итак, чтобы создать запись для Xyz, должна быть отображена запись Abc.

Теперь с точки зрения структуры запроса мне нужно создать один запрос POST для Abc, подобный

POST /Abc

Это довольно просто. Но проблема с Xyz. Требование заключается в том, что всякий раз, когда пользователь приходит для создания Xyz, он также может запросить обновить прикрепленную запись Abc. Например, Я создал запись для Abc с идентификатором 5. Теперь, когда я хочу создать соответствующую запись Xyz, я буду запрашивать обновление записи Abc с идентификатором 5 и создавать новую запись Xyz для этого внешнего ключа. Так, PATCH / Abc а также POST / Xyz Но клиент запрашивает только один раз и передает данные целиком по одному URI.

Итак, как правильно обрабатывать несколько методов HTTP на одном URI? Должен ли я создать запрос POST или PATCH?

Я не смог создать 2 запроса, потому что клиент хочет этот процесс как транзакционный.

1 Ответ

0 голосов
/ 05 января 2019

Во-первых, я думаю, вы должны думать, что это

Я не смог создать 2 запроса, потому что клиент хочет, чтобы этот процесс был транзакционным.

по-другому. На мой взгляд, требование к транзакции может означать просто - я могу быть совершенно неправ в этом, поэтому выясните правду - что при обновлении до Abc процесс создания нового Xyz выполняется с обновлением Abc. Таким образом, Xyz не создается, если обновление для Abc завершается неудачно (или наоборот) и возвращается какая-то ошибка.

Таким образом, вы можете создать две конечные точки:

  • один с POST : новый Xyz
  • еще один для создания нового Xyz и одновременного обновления Abc транзакционно

Так что вы можете создать две конечные точки. Более интересно то, что это последний POST или PATCH ? Вроде как-то так и есть, да.

Однако см. - например - этот вопрос и принятый ответ , существует примерно PATCH :

Метод PATCH запрашивает, чтобы набор изменений, описанный в объекте запроса, был применен к ресурсу, идентифицированному Request-URI

Теперь возникает следующий вопрос: изменились ли Abc , идентифицированные по Request-URI ? Если нет, то это - как я понимаю - POST .

Это означает, что вам нужна только одна конечная точка POST , которая проверяет, есть ли необходимость, и выполняет ли транзакционный идентификатор обновления. Но, возможно, было бы лучше иметь отдельные конечные точки.

...