Перш ніж прочитати мою відповідь, я хотів би сказати, що погодився з @Neil. Треба вибирати наші битви. Зазвичай ми хочемо зробити все можливе, але іноді замало місця для дискусій, і нам доводиться приймати рішення проти нашої волі.
У будь-якому випадку, у відповіді Ніла я пропускаю ще одне. Документація . Просто для того, щоб розробники знали, що POST просить /search
бути безпечними.
Це сказав.
1. Дайте шанс отримати
Розглянемо GET
спочатку варіант. Перевірте максимальну довжину URL-адреси цього питання . Оцініть, чи довша ваша найдовша рядок запиту перевищує 2000 символів. Якщо це не так, і ви не очікуєте, що це буде, почніть GET
. Це може здатися некрасивим, але принаймні ви можете зробити закладку URL-адреси, і, звичайно, у неї є всі переваги, отримані з семантики методу (ідентифікація, безпека та кешування)
1.1 Спробуйте кодувати рядок запиту
Наприклад, у базі 64. Навіть javascript підтримує базові кодування 64 .
Ось як це працює:
- Побудуйте JSON з усіма фільтрами та нормалізуйте його.
- Розбираємо його на рядок
- Зашифруйте його
- Відправити закодований JSON як параметр запиту (
/search?q=SGVsbG8gV29ybGQh....
).
- На стороні сервера розшифруйте параметр q .
- Десеріалізуйте рядок JSON
Попередньо зробіть найдовший можливий рядок JSON, закодуйте його та візьміть довжину. Оцініть, чи відповідає кодований рядок в URL-адресі. Я реалізував наступний фрагмент на Fiddle.js для тестування. (Я сподіваюся, що це все ще працює) 1
Базові коди 64 є детермінованими та оборотними, тому немає шансів на зіткнення.
За допомогою закодованих запитів ми також могли б зберігати пошукові запити в БД, закладку URL-адреси, спільне використання посилань тощо. І, звичайно, нам не потрібно уникати / не скасовувати рядок.
1.2 Спробуйте з псевдонімами
Читаючи цей блог про те, як створити API REST, я згадав ще одну альтернативу. Псевдоніми для загальних запитів .
Мені це здається цікавим з наступних причин
Скоротіть довжину рядка запиту. Це робить API більш чистим та зручним для користувачів
GET / квитки /? Status = closed & closedAt = xxx проти
GET / квитки / нещодавно закриті /
Поєднується з більшою кількістю псевдонімів або більше параметрів запиту.
GET / квитки /? Статус = закритий та закритийAt = xxx та протягом = 30 хв проти
GET / квитки / недавно закриті /? В межах = 30 хв
Ми можемо комбінувати псевдоніми з кодованими рядками запитів
GET / квитки /? Статус = закритий та закритийAt = xxx та протягом = 30 хв. Проти
GET / квитки / недавно закриті /? Q = SGVsbG8g ...
1: Я використовував JSON, але ми могли використати інші формати, як тільки зможемо його дезаріалізувати на стороні сервера.
search?q=t
,search?q=te
,search?q=test
і так далі. Подумайте про обмеження частоти надсилання запиту, щоб не травмувати ваш сервер. Ви також можете повернути велику кількість інформації і на стороні клієнта зробити фільтрацію. Це добре працює, якщо користувач вводить широкі категорії, які можуть суттєво звузити речі.