Zgodnie z zasadami REST chciałbym utworzyć metodę GET dla mojego interfejsu API, która przeprowadzi wyszukiwanie przy użyciu niektórych kryteriów i zwróci wyniki klientowi. Problem polega na tym, że kryteria mogą mieć do 14 parametrów, jednym z nich jest lista złożonych obiektów, więc ...
Nie wiem nawet, czy można zakodować / zdekodować te złożone obiekty do / z parametrów adresu URL.
Nie obliczyłem, jak długi może być adres URL, ale jestem pewien, że będzie on wystarczająco duży i być może osiągnie limit długości adresu URL?
Ponadto wyszukiwanie powinno pokazywać wyniki w „czasie rzeczywistym”, to znaczy za każdym razem, gdy użytkownik zmienia coś z formularza wyszukiwania, powinien być w stanie zobaczyć nowe wyniki bez naciskania żadnego przycisku „wyszukiwania”.
Czy mógłbyś mi wyjaśnić te kwestie i jaka byłaby twoja rada, aby stworzyć metodę wyszukiwania opartą na wielu parametrach?
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.Odpowiedzi:
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ź zGET
. 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:
/search?q=SGVsbG8gV29ybGQh....
).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.
źródło
Jeśli masz tylko młotek, wszystko wygląda jak gwóźdź. Wygląda na to, że problem polega na tym, że próbujesz zamienić stronę wyszukiwania w stronę RESTful, a to raczej nie jest powszechny wzór do rozwiązania przy projektowaniu RESTful.
Po prostu przejdź do żądania POST z parametrami podanymi przez użytkownika, aby uzyskać wymagane informacje z backendu. Zakładam, że nie musisz nic robić poza wyszukiwaniem, więc nie ma szans, że będziesz musiał wstawić tę stronę. Wystarczy dodać opcję / search na końcu swojego adresu URL, aby nie ryzykować konfliktów ze stroną / users, które byłyby RESTful.
źródło
To w pełni zależy od tego, jaki jest twój model API: jako brak lub jako czasownik.
Jeśli API nie ma, możesz chcieć uzyskać listę obiektów w następujący sposób:
W takim przypadku musisz wysłać dane jako parametry żądania. Musisz więc opisać swoje parametry jako płaską listę kluczowych wartości:
Niektóre platformy obsługują niestandardowe narzędzie do rozwiązywania parametrów (np. Spring MVC), w którym można konwertować parametry na obiekt.
źródło