REST API: niestandardowe nagłówki HTTP a parametry adresu URL

98

Kiedy używasz niestandardowych nagłówków HTTP w części żądania interfejsu API REST?

Przykład:

Czy kiedykolwiek używałbyś

GET /orders/view 
(custom HTTP header) CLIENT_ID: 23

zamiast

GET /orders/view/client_id/23 or 
GET /orders/view/?client_id=23
Vasile Cotovanu
źródło

Odpowiedzi:

126

Adres URL wskazuje sam zasób. A „klient” jest zasobem, który może być rozpatrzony, więc powinny być częścią podstawowego adresu URL: /orders/view/client/23.

Parametry służą tylko do parametryzacji dostępu do zasobu. To przede wszystkim wchodzi w grę ze stanowisk i wyszukiwania: /orders/find?q=blahblah&sort=foo. Jest to linia w porządku między parametrami i podrzędnych zasobów: /orders/view/client/23/active versus /orders/view/client/23?show=active. Polecam styl zasobu podrzędnego i rezerwuję parametry do wyszukiwania.

Ponieważ każdy punkt końcowy REprezentuje transfer stanu (w celu zmiany mnemonika), niestandardowe nagłówki powinny być używane tylko w przypadku rzeczy, które nie obejmują nazwy zasobu (adresu URL), stanu zasobu (treści) lub bezpośrednio parametrów wpływające na zasób (parametry). To pozostawia prawdziwe metadane dotyczące żądania niestandardowych nagłówków.

HTTP ma bardzo szeroki wybór nagłówków, które obejmują prawie wszystko, czego potrzebujesz. Tam, gdzie pojawiają się niestandardowe nagłówki, jest to system do żądania systemowego działającego w imieniu użytkownika. System proxy zweryfikuje użytkownika i doda „ X-User: userid” do nagłówków i użyje poświadczeń systemowych, aby dotrzeć do punktu końcowego. System odbierający sprawdza, czy poświadczenia systemowe są upoważnione do działania w imieniu użytkownika, a następnie sprawdza, czy użytkownik jest upoważniony do wykonania tej czynności.

Nialscorva
źródło
Dzięki za tak wyczerpującą odpowiedź! Czy nadal używałbyś X-User do mobilnego interfejsu API, w którym ryzyko posiadania złego serwera proxy (który usuwa nagłówek) jest nadal wysokie?
Vasile Cotovanu,
1
Nie, użycie X-User, o którym wspomniałem, dotyczy połączeń systemowych, w których system działa w imieniu strony trzeciej. Na przykład użytkownik U rozmawia z serwerem A. Serwer A przedstawia poświadczenia serwerowi B z nagłówkiem X-User z napisem „Użyj moich danych uwierzytelniających, aby sprawdzić, czy jestem upoważniony do wykonania tej czynności w imieniu użytkownika U”. Pojawia się to w architekturach zorientowanych na usługi i zwykle używasz protokołu HTTPS. Platforma mobilna prawie zawsze powinna być działaniem samego Użytkownika i korzystać z odpowiednich danych uwierzytelniających w pierwszej osobie do transakcji.
Nialscorva,
8
Trzeci akapit to jedna z najbardziej pouczających odpowiedzi, jakie przeczytałem na SO ;-)
Alistair77
1
@Nialscorva Świetne wyjaśnienie! co jeśli chcę, aby użytkownik korzystał z mojego interfejsu API za pośrednictwem autoryzowanego kontenera (takiego jak moja aplikacja mobilna)? To, co teraz robię, to fakt, że moja aplikacja mobilna nie jest upoważniona do samodzielnego wykonywania żadnych działań, ani też użytkownik końcowy ... oba poświadczenia muszą być obecne, jeśli użytkownik chce wykonać jakąś czynność.
bolbol
6

Niestandardowe nagłówki mają następujące zalety:

  • Można go łatwo odczytać za pomocą narzędzi / skryptów sieciowych (uwierzytelnianie, metainformacje, ...)
  • Chroni adresy URL przed zabezpieczeniami (bezpieczniejsze, nie w pamięci podręcznej przeglądarki / serwera proxy)
  • Utrzymuje czystsze adresy URL: umożliwia lepsze buforowanie zasobów
Christophe Roussy
źródło
mogą być również po cichu usuwane / filtrowane przez proxy
fusi
@fusi dobra uwaga ... oto temat na ten temat: stackoverflow.com/questions/20820572/…
Christophe Roussy
5

Używałbym niestandardowego nagłówka tylko wtedy, gdy nie ma innego sposobu przekazywania informacji według standardu lub konwencji. Darren102 wyjaśnia typowy sposób przekazywania tej wartości. Twój interfejs API będzie znacznie bardziej przyjazny, jeśli użyjesz typowych zwrotów wzorców i niestandardowych nagłówków, co nie oznacza, że ​​nie będziesz mieć możliwości ich użycia, tylko że powinny one być ostatecznością i czymś, czego nie obsługuje specyfikacja HTTP.

pozywanie
źródło
Całkowicie się zgadzam ... nigdy nie odkrywaj na nowo koła, jeśli istnieje standardowy sposób wykonania zadania.
Alessandro Santini
5

Kiedy używasz ... nagłówków HTTP w części żądania interfejsu API REST?

Uwierzytelnianie: identyfikatory GUID, uwierzytelnianie podstawowe, tokeny niestandardowe itp. Np. Uwierzytelnianie podstawowe z tokenem Guid dla interfejsu REST API zamiast nazwy użytkownika / hasła

Jeśli bierzesz udział w przekazywaniu tokenów lub innych informacji podobnych do uwierzytelniania między domenami objętymi PCI-DSS lub innymi regułami bezpieczeństwa, być może będziesz musiał zakopać parametry, ponieważ niektóre przepisy wyraźnie wymagają, aby elementy uwierzytelniania pozostały z dala od adresów URL, które można by trywialnie odtworzyć (z historie przeglądarek, dzienniki proxy itp.).

user3038458
źródło
1

Nie ma standardu dla REST, ale akceptowany sposób byłby

GET /orders/view/23

Nieużywanie niestandardowych nagłówków, a zatem widok 23 po zakłada, że ​​jest to identyfikator, dlatego miałbyś funkcję, która pobiera identyfikator, a zatem tworzy tylko te informacje.

darren102
źródło
1

Nie użyłbym niestandardowych nagłówków, ponieważ nie wiesz, czy jakiekolwiek proxy je przekażą. Oparty na adresie URL to droga do zrobienia.

GET / zamówienia / widok / klient / 23

Antony Scott
źródło
1
Nie polecałbym też niestandardowych nagłówków, ale zepsute serwery proxy nie są powodem. Proxy jest zepsute, należy to naprawić.
Julian Reschke
1

Zdecydowanie OK:

GET /orders/view/client_id/23 or 
GET /orders/view/?client_id=23

Też dobrze:

GET /orders/view/23 or 

Myślę, że to też byłoby w porządku:

POST /orders/view 
(custom HTTP header) CLIENT_ID: 23
paulsm4
źródło
Pełna odpowiedź POST REST powinna być odpowiedzią HTTP 303 z nagłówkiem Location ustawionym na przykład „/ orders / view / 23”.
Rich Remer,
0

Możesz użyć niestandardowych nagłówków, aby dołączyć więcej informacji o częściowo przetworzonym żądaniu, biorąc pod uwagę, że kopertowanie nie jest dobrą praktyką. Nagłówki są bezpieczne .

Anwar Husain
źródło