API REST: запрос GET с телом

Я хочу реализовать REST API и нуждаюсь в теле в моих запросах GET. (Как обсуждалось здесь: HTTP GET с телом запроса)

Есть ли http-клиенты, которые не могут отправить тело с запросом GET? Fiddler способен это сделать, хотя поле сообщения красное.

Ответы

Ответ 1

Как правило, идея GET в REST заключается в том, что любой из ваших параметров отправляется в URL. Поскольку ответ на вопрос, который вы указали, указывает, что он выполним, но пропускает точку REST, которая должна иметь согласованный интерфейс webbish. Если вы хотите передать сложные данные своей конечной точке, вы, вероятно, захотите использовать POST, который ваши пользователи ожидают иметь тело. Я настоятельно рекомендую пересмотреть эту реализацию.

Но к вашему фактическому вопросу, конечно, есть клиенты, которые не могут отправить тело в GET. В основном, я бы предположил, что ваши клиенты будут программными, скажем, python urlib2, и, хотя вы можете установить тело в GET, на самом деле это не намеренное использование модуля, поэтому вы вынуждаете программиста становиться странным. Что еще более важно, идея REST api - быть клиентом-агностиком, поэтому мне кажется, что ваш дизайн API должен быть переработан здесь.

Ответ 2

Это плохая идея использовать тело в запросах GET HTTP. Да, похоже, что "de jure" HTTP GET может иметь тело, но "де-факто" у вас будут проблемы:

  • С клиентскими инфраструктурами/библиотеками. Его будет сложно найти.
  • Сервер может просто игнорировать тело запроса GET. И вообще это не стандартный способ, и могут быть проблемы с сервером или его конфигурацией.
  • Это делает ваш код, особенно на стороне сервера, непонятным для других, потому что никто не ожидает GET с телом.

Вы ищете трудный путь? С GET с телом у вас будет так много подводных камней. Почему бы не использовать другие HTTP-глаголы?

Например, используйте POST (или некоторые другие глаголы), чем:

  • легко иметь уже готовую клиентскую библиотеку,
  • никаких проблем с конфигурацией сервера или сервера,
  • это понятно для других

Не искать более сложные способы:)