2012-06-18 2 views
18

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

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

ответ

25

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

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

+1

Да, это будет моим вторым выбором. Его правда, что использование тела по запросу GET не является полностью спокойным, но его необходимо. Длина URL ограничена и часто возникают проблемы со сложными данными. Если нет возможности для GET, я буду использовать POST, но пользователи будут рассматривать POST для создания и GET для извлечения данных. Однако другого варианта я не вижу. – user437899

+5

Я вижу, что я думаю, что он будет чувствовать себя менее мутантным для пользователей, чтобы представить конечную точку POST в качестве поставщика услуг, которая обрабатывает свои сложные данные XML/JSON и отвечает на результат, а не будет создавать нестандартные GET запрос. POST часто используется таким образом, GET - нет. – Ben

9

Плохая идея использовать тело в запросах GET HTTP. Да, похоже, что «де-юре» HTTP GET может иметь тело, но «де-факто» у вас будут проблемы:

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

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

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

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

не ищите более твердые способы :)

+0

Можете ли вы оправдать «И вообще, это не стандартный способ», pls. О каком «стандарте» вы имеете в виду? –

+1

Я имею в виду стандарты HTTP и документы RFC, например. http://tools.ietf.org/html/rfc2616. HTTP GET-запросы с телом нестандартны – Regfor

+2

Ну, HTTP 1.1, похоже, позволяет отправлять сообщения для запросов GET (не запрещая их): 'Тело сообщения НЕ ДОЛЖНО быть включено в запрос, если спецификация метода запроса (раздел 5.1.1) не позволяет отправлять тело объекта в запросы. «Спецификация GET в 5.1.1 не кажется« не разрешенной ». –