Rest API - проблема сортировки по нескольким столбцам - PullRequest
0 голосов
/ 06 февраля 2020

Я видел несколько статей о Best Practices с REST API, и они предлагают белую сортировку по нескольким столбцам. GET / users? Sort_by = -last_modified, + email

https://www.moesif.com/blog/technical/api-design/REST-API-Design-Filtering-Sorting-and-Pagination/

Когда я использую этот подход, я вижу, что - работает нормально, но + заменяется пробелом.

Быстрый Google показывает, что + это специальный символ после? в URL. Что мне здесь не хватает?

> The following characters have special meaning in the path component of
> your URL (the path component is everything before the '?'):   ";" |
> "/" | "?"
> 
> In addition to those, the following characters have special meaning in
> the query part of your URL (everything after '?'). Therefore, if they
> are after the '?' you need to escape them:   ":" | "@" | "&" | "=" |
> "+" | "$" | ","
> 
> For a more in-depth explanation, see the RFC.

1 Ответ

0 голосов
/ 06 февраля 2020

Чего мне здесь не хватает?

История, в основном.

U + 002B (+) - это под-раздел, в контексте URI и может свободно использоваться в части запроса; см. RF C 3986 Приложение A .

Но в Интернете , общий источник данных запроса - HTML отправка формы; когда мы отправляем форму, обработчик собирает пары значений ключа из формы и создает последовательность символов application / x- www-form-urlencoded, которая становится запросом URI.

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

Это означает, что в ваших веб-журналах вы увидите:

/users?sort_by=-last_modified,+email

потому что это URI, который вы получили, но в вашем отображении параметров вы увидите

"sort_by" = "-last_modified, email"

, потому что «данные формы» декодируются до того, как вы их просматриваете.

Форма urlencoding имеет явный шаг, который заменяет любые пробелы (U + 0020) на U + 002B, а вместо этого U + 002B кодируется в процентах.

Чтобы проверить, является ли это вместо этого попробуйте выполнить следующий запрос:

GET /users?sort_by=-last_modified,%2Bemail

Я ожидаю, что вы обнаружите, что искомый плюс появляется в параметрах формы:

"sort_by" = "-last_modified,+email"
...