Должен ли я использовать POST-запрос для отправки запроса поиска на мой сервер для большого массива идентификаторов? - PullRequest
0 голосов
/ 28 августа 2018

читаю следующие посты; однако я до сих пор не нашел окончательного ответа на свой вопрос.

Когда вы используете POST и когда вы используете GET?

Как выбрать между методами GET и POST в формах HTML?

Так почему мы должны использовать POST вместо GET для публикации данных? [Дубликат]

Я хочу сделать HTTP-запрос на мой сервер, чтобы получить некоторые данные на основе массива идентификаторов, которые я передам на сервер. Поскольку каждый идентификатор будет иметь длину 23 символа, отправка 100 из этих идентификаторов в качестве параметров запроса GET-запроса будет превышать ограничение длины символов в некоторых браузерах . Поскольку стандартный запрос GET невозможен из-за ограничений URL-адреса, я рассмотрел другие варианты.

Опция 1: Использовать тело запроса HTTP GET-запроса (не рекомендуется в соответствии со следующим потоком SO)

HTTP GET с телом запроса

Вариант 2: Использовать тело HTTP-запроса POST для отправки массива идентификаторов. Это метод, который Dropbox использовал для своего общедоступного API.

Я знаю, что запросы POST должны быть зарезервированы для запросов, которые не являются идемпотентными, и в моем случае я должен использовать запрос GET, потому что запрос идемпотентен. Я также знаю, что REST - это просто руководство, и поскольку этот API будет использоваться только мной, я могу делать все, что захочу; тем не менее, я думал, что получу второе мнение по этому вопросу, прежде чем принять какое-либо решение.

Итак, что мне делать в моей ситуации? Есть ли лучшие альтернативы, которые мне еще предстоит найти, и есть ли что-то, что я должен рассмотреть, если я использую запрос POST?

1 Ответ

0 голосов
/ 28 августа 2018

Итак, что мне делать в моей ситуации?

Первый шаг - просмотреть реестр методов HTTP, который определен в RFC 7231

Дополнительные методы, выходящие за рамки данной спецификации, были стандартизированы для использования в HTTP. Все такие методы должны быть зарегистрированы в «Реестре методов передачи гипертекста (HTTP)», поддерживаемом IANA

Реестр в данный момент находится здесь: https://www.iana.org/assignments/http-methods/http-methods.xhtml

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

В вашем случае вы пытаетесь передать запрос с телом сообщения. Как правило, запросы не просто идемпотент , но также безопасны .

Быстрый просмотр реестра может привести к рассмотрению ПОИСК

ПОИСК - безопасный метод; он не имеет никакого значения, кроме выполнения запроса и возврата результата запроса

Это похоже на хороший вариант, пока вы внимательно не прочитаете спецификацию и не заметите ограничения , касающиеся тела сообщения . Короче говоря, WebDAV, вероятно, не то, что вы хотите.

Но, может быть, что-то еще подходит.

Второй вариант - считать вашу идиому поиска протоколом. Вы POST (или PUT, или PATCH) идентификаторы на сервер, чтобы создать ресурс, а затем получить представление этого ресурса, когда вы хотите результаты.

Сам по себе это не совсем тот единственный звонок и ответ, который вам нужен. Что он делает, так это заставляет вас думать о том, как вернуть представление ресурса результата запроса. В частности, вы можете использовать Content-Location , чтобы сообщить посредникам, что тело ответа фактически является представлением ресурса.

Я знаю, что POST-запросы должны быть зарезервированы для запросов, которые не являются идемпотентными

Это не совсем верно. При выполнении запросов, которые соответствуют семантике другого метода, мы предпочитаем использовать этот другой метод, чтобы промежуточные компоненты могли использовать преимущества семантики: можно попробовать идемпотентный запрос, предварительно извлечь безопасный запрос и т. Д. Поскольку POST не предоставляет такие гарантии, клиенты не могут воспользоваться ими , даже если они применяют .

В зависимости от того, как вам нужно управлять пространством имен URI серверов источника, вы можете использовать PUT - концептуально запрос и результаты являются двойственными, поэтому их можно рассматривать как два разных представлений одного и того же. Вы можете управлять этим с помощью типов медиа - один для запроса, другой для ответа.

Это возвращает вас к идемпотенту, но не дает вам безопасности.

Я подозреваю, что безопасные запросы с полезными нагрузками всегда будут проблемой; заголовок Vary в HTTP не позволяет серверу объявить, что возвращаемое представление зависит от тела запроса (отчасти потому, что GET не должен иметь тело запроса), поэтому промежуточному компоненту будет трудно понять последствия кэширования тела запроса.

Я наткнулся на другой альтернативный метод из другого потока SO, который должен был туннелировать запрос GET, используя метод POST / PUT, добавив заголовок запроса X-HTTP-Method-Override. Как вы думаете, это законное решение моего вопроса?

Нет, я не думаю, что это решит вашу проблему вообще. X-HTTP-Method-Override (и его варианты написания) предназначены для туннелирования методов, а не для переопределения метода. X-HTTP-Method-Override: GET сообщает серверу, что у полезной нагрузки нет определенной семантики , что возвращает вас в ту же самую лодку, что и при использовании запроса GET.

...