API: какой глагол следует использовать с параметрами массива - PullRequest
0 голосов
/ 30 сентября 2019

Например, нам нужен метод API, который получает массив в качестве входных данных (массив идентификаторов устройств) и возвращает список этих устройств (полная информация о каждом устройстве).

Итак, естьвсе атрибуты метода GET, но это плохая идея передать его в URL (массив может быть большим), поэтому было бы лучше передать его в теле:

    [HttpGet("api/deviceNames")]
    [ProducesResponseType(typeof(List<DeviceInfo>), StatusCodes.Status200OK)]
    public IActionResult GetDeviceNamesByIds([FromBody]List<string> deviceIds)
    {
        var d = _deviceService.GetDevicesByIds(deviceIds);

        return Ok(d);
    }

Он работает и работает отлично. Но многие авторы не рекомендуют использовать тело для методов GET, например https://groups.yahoo.com/neo/groups/rest-discuss/conversations/messages/9962?guccounter=1

Да. Другими словами, любое сообщение HTTP-запроса может содержать тело сообщения и, следовательно, должно анализировать сообщения с учетом этого. Однако семантика сервера для GET ограничена таким образом, что тело, если оно есть, не имеет семантического значения для запроса. Требования к синтаксическому анализу отделены от требований к семантике метода.

Итак, да, вы можете отправить тело с GET, и нет, это бесполезно.

Эточасть многоуровневой структуры HTTP / 1.1, которая станет понятной после разделения спецификации (работа в процессе).

.... Рой

, но с другой стороны:

Обновление RFC2616, называемый «HTTP / 1.1 spec», теперь устарел. В 2014 году он был заменен RFC 7230-7237. Цитата «тело сообщения ДОЛЖНО игнорироваться при обработке запроса» была удалена. Теперь это просто «Запрос на создание кадра не зависит от семантики метода, даже если метод не определяет какого-либо использования для тела сообщения». Вторая цитата: «Метод GET означает получение любой информации ... идентифицированной по Request-URI»был удален- из комментария

1 Ответ

1 голос
/ 01 октября 2019

RFC 7231 не изменили семантику

Полезная нагрузка в сообщении запроса GET не имеет определенной семантики;отправка тела полезной нагрузки по запросу GET может привести к тому, что некоторые существующие реализации отклонят запрос.

Это не работает нормально - не совсем. Проблема в том, что семантика кэширования HTTP не учитывает тело запроса;Компоненты общего назначения будут предполагать, что сервер соблюдает стандартизированную семантику, и поэтому не собираются копаться в теле сообщения запроса, чтобы посмотреть, соответствует ли массив запроса любому из ранее кэшированных представлений.

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

Поскольку кэширование является важным ограничением в REST архитектурном стиле , это явно шаг в неправильном направлении.

Если вы должны использовать полезную нагрузку, то вам, вероятно, следует смотреть на POST, а не GET. См. Также: SOAP, GraphQL.

Но POST совсем не идемпотентен

Это верно. Есть компромисс, который нужно сделать.

...