Jak podano w http://www.boutell.com/newfaq/misc/urllength.html , ciąg zapytania HTTP ma ograniczoną długość. Może być ograniczona przez klienta (Firefox, IE, ...), serwer (Apache, IIS, ...) lub sprzęt sieciowy (aplikacyjna zapora, ...).
Dziś mam ten problem z formularzem wyszukiwania. Opracowaliśmy formularz wyszukiwania z wieloma polami, który jest wysyłany na serwer jako żądanie GET, więc mogę dodać zakładkę do wynikowej strony.
Mamy tak wiele pól, że nasz ciąg zapytania ma 1100 bajtów i mamy zaporę ogniową, która odrzuca żądania HTTP GET z więcej niż 1024 bajtami. Nasz administrator systemu zaleca nam zamiast tego używanie POST, aby nie było żadnych ograniczeń.
Jasne, POST zadziała, ale naprawdę czuję wyszukiwanie jako GET, a nie POST. Więc myślę, że przejrzę nasze nazwy pól, aby upewnić się, że ciąg zapytania nie jest zbyt długi, a jeśli nie mogę, będę pragmatyczny i użyję POST.
Ale czy istnieje błąd w projektowaniu usług RESTful? Jeśli mamy ograniczoną długość żądania GET, jak mogę wysłać duże obiekty do usługi sieciowej RESTful? Na przykład, jeśli mam program, który sprawia, że obliczenia oparte na pliku i chcę, aby zapewnić relaksującego usługa takiego: http://compute.com?content=<base64 file>
. To nie zadziała, ponieważ ciąg zapytania nie ma nieograniczonej długości.
Jestem trochę zdziwiony ...
Odpowiedzi:
Na podstawie twojego opisu IMHO powinieneś użyć POST. POST służy do umieszczania danych na serwerze i, w niektórych przypadkach, uzyskiwania odpowiedzi. W twoim przypadku wykonujesz wyszukiwanie (wysyłasz zapytanie do serwera) i uzyskujesz wynik tego wyszukiwania (odzyskujesz wynik zapytania).
Definicja GET mówi, że należy go użyć do pobrania już istniejącego zasobu. Z definicji POST polega na utworzeniu nowego zasobu. To jest dokładnie to, co robisz: tworzenie zasobu na serwerze i pobieranie go! Nawet jeśli nie przechowujesz wyniku wyszukiwania, utworzyłeś obiekt na serwerze i pobrałeś go. Jak wcześniej powiedział PeterMmm, można to zrobić za pomocą POST (utworzyć i zapisać wynik zapytania), a następnie użyć GET do pobrania zapytania, ale bardziej praktyczne jest wykonanie tylko POST i odzyskanie wyniku.
Mam nadzieję że to pomoże! :)
źródło
Specyfikacja HTTP faktycznie zaleca używanie POST podczas wysyłania danych do zasobu w celu obliczenia.
Twoje wyszukiwanie wygląda jak obliczenia, a nie sam zasób. To, co możesz zrobić, jeśli nadal chcesz, aby wyniki wyszukiwania były zasobem, to utworzyć token, aby zidentyfikować ten konkretny wynik wyszukiwania i przekierować klienta użytkownika do tego zasobu.
Po pewnym czasie możesz usunąć tokeny wyników wyszukiwania.
Przykład
następnie
W ten sposób przeglądarki i serwery proxy mogą nadal buforować wyniki wyszukiwania, ale przesyłasz parametry zapytania za pomocą POST.
EDYTOWAĆ
Dla wyjaśnienia,
01543164876
tutaj reprezentuje unikalny identyfikator zasobu reprezentującego twoje wyszukiwanie. Te 2 żądania zasadniczo oznaczają: utwórz nowy obiekt wyszukiwania z tymi kryteriami, a następnie pobierz wyniki powiązane z utworzonym obiektem wyszukiwania.Ten identyfikator może być unikalnym identyfikatorem generowanym dla każdego nowego żądania. Oznaczałoby to, że z serwera wycieknie obiekty „wyszukiwania” i będziesz musiał je regularnie czyścić za pomocą strategii buforowania.
Lub może to być skrót wszystkich kryteriów wyszukiwania faktycznie reprezentujących wyszukiwanie zadane przez użytkownika. Pozwala to na ponowne wykorzystanie identyfikatorów, ponieważ ponowne utworzenie wyszukiwania zwróci istniejący identyfikator, który może (ale nie musi) być już zapisany w pamięci podręcznej.
źródło
REST to sposób robienia rzeczy, a nie protokół. Nawet jeśli nie lubisz POST, gdy jest to naprawdę GET, zadziała.
Jeśli będziesz / musisz pozostać przy "standardowej" definicji GET, POST, itp., To może rozważyć POST zapytanie, to zapytanie zostanie zapisane na serwerze z identyfikatorem zapytania i zażąda zapytania później za pomocą GET według identyfikatora.
źródło
Odnośnie twojego przykładu:
http://compute.com?content={base64file}
użyłbym POST, ponieważ przesyłasz "coś" do obliczenia. Dla mnie to „coś” bardziej przypomina zasób jako prosty parametr.W przeciwieństwie do tego w zwykłym wyszukiwaniu zacząłbym trzymać się GET i parametrów. Ułatwiasz klientom api testowanie i zabawę z interfejsem API. Uczyń dostęp tylko do odczytu (który w większości przypadków stanowi większość ruchu) tak prostym, jak to tylko możliwe!
Ale dylemat dużych ciągów zapytań jest ważnym ograniczeniem GET. Tutaj postąpiłbym pragmatycznie, o ile nie przekroczysz tego limitu, użyj GET i parametrów url. To zadziała w 98% przypadków wyszukiwania. Działaj tylko wtedy, gdy osiągniesz ten limit, a następnie wprowadź również POST z ładunkiem (z typem mime
Content-Type: application/x-www-form-urlencoded
).Czy masz więcej przykładów ze świata rzeczywistego?
źródło
Zamieszanie związane z GET to ograniczenie przeglądarki. Jeśli tworzysz interfejs RESTful dla aplikacji A2A lub P2P, nie ma ograniczeń co do długości Twojego GET.
Teraz, jeśli zdarzy ci się użyć przeglądarki, aby wyświetlić interfejs RESTful (aka podczas programowania / debugowania), napotkasz ten limit, ale istnieją narzędzia, które pozwalają obejść ten problem.
źródło
To jest proste. Użyj POST. HTTP nie narzuca ograniczenia długości adresu URL dla GET, ale serwery tak. Bądź pragmatyczny i omijaj to za pomocą POST.
Możesz również użyć treści GET (jest to dozwolone), ale jest to podwójna sztuczka, ponieważ nie jest to poprawne użycie i prawdopodobnie spowoduje problemy z serwerem.
źródło