Zanim przeczytasz moją odpowiedź, chciałbym powiedzieć, że zgodziłem się z @Neil. Musimy wybrać nasze bitwy. Zwykle chcemy dać z siebie wszystko, ale czasem jest za mało miejsca na dyskusje i musimy podejmować decyzje wbrew naszej woli.
W każdym razie, w odpowiedzi Neila, brakuje mi jeszcze jednej rzeczy. Dokumentacja . Aby upewnić się, że programiści wiedzą, że żądania POST /search
są bezpieczne.
To mówi.
1. Daj szansę GET
GET
Najpierw rozważ opcję. Sprawdź maksymalną długość adresu URL tego pytania . Oceń, czy najdłuższy ciąg zapytania ma więcej niż 2000 znaków. Jeśli tak nie jest i nie spodziewasz się, że tak będzie, idź z GET
. Może się to wydawać brzydkie, ale przynajmniej możesz dodać do zakładek adres URL i, oczywiście, ma wszystkie zalety wynikające z semantyki metody (idempotencja, bezpieczeństwo i buforowanie)
1.1 Spróbuj zakodować ciąg zapytania
Na przykład w bazie 64. Nawet javascript obsługuje kodowanie bazy 64 .
Oto jak to działa:
- Zbuduj JSON ze wszystkimi filtrami i znormalizuj go.
- Parsuj to na string
- Zakoduj to
- Wyślij zakodowany JSON jako żądanie param (
/search?q=SGVsbG8gV29ybGQh....
).
- Po stronie serwera zdekoduj parametr q .
- Deserializuj ciąg JSON
Wcześniej wykonaj najdłuższy możliwy ciąg JSON, zakoduj go i przyjmij długość. Oceń, czy zakodowany ciąg pasuje do adresu URL. Zaimplementowałem następujący fragment kodu w Fiddle.js do przetestowania. (Mam nadzieję, że nadal działa) 1
Podstawowe kody 64 są deterministyczne i odwracalne, więc nie ma szans na kolizje.
Za pomocą zakodowanych zapytań możemy również zapisywać wyszukiwania w bazie danych, dodawać do zakładek adres URL, udostępniać linki itp. I oczywiście nie musimy uciekać / usuwać scen z łańcucha.
1.2 Spróbuj użyć aliasów
Czytając ten blog na temat projektowania interfejsów API REST, przypomniałem sobie jeszcze jedną alternatywę. Aliasy dla typowych zapytań .
Uważam, że są interesujące z następujących powodów
Skróć długość ciągu zapytania. Dzięki temu interfejs API jest czystszy i przyjazny dla użytkownika
GET / bilety / status = zamknięte i zamknięte At = xxx vs
GET / bilety / ostatnio zamknięte /
Można łączyć z większą liczbą aliasów lub większą liczbą parametrów żądania.
GET / bilety / status = zamknięte i zamknięte At = xxx i w ciągu = 30 minut vs
GET / bilety / ostatnio zamknięte / w ciągu = 30 minut
Możemy łączyć aliasy z zakodowanymi ciągami zapytań
GET / bilety /? Status = zamknięte i zamknięte At = xxx i w ciągu = 30 min vs
GET / bilety / ostatnio zamknięte /? Q = SGVsbG8g ...
1: Użyłem JSON, ale moglibyśmy użyć innych formatów, jak tylko moglibyśmy dokonać deserializacji po stronie serwera.
search?q=t
,search?q=te
,search?q=test
i tak dalej. Rozważ ograniczenie częstotliwości wysyłania zapytania, aby uniknąć uszkodzenia serwera. Możesz również zwrócić wiele informacji i po stronie klienta przeprowadzić filtrowanie. Działa to dobrze, jeśli użytkownik wprowadza szerokie kategorie, które mogą znacznie zawęzić zakres.