Co należy do nagłówka żądania HTTP vs treść żądania?

51

Pracuję nad zestawem usług internetowych dla klienta mobilnego, a wymagania wymagają, aby unikalny identyfikator urządzenia był dołączany do wszystkich żądań, aby był przechowywany w niektórych żądaniach i używany do filtrowania wyników w innych.

Zasugerowano, aby umieścić go w niestandardowym nagłówku HTTP, ponieważ będzie on dołączany do wszystkich żądań, więc zacząłem zastanawiać się, jakie kryteria można zastosować, aby ustalić, czy dany fragment danych należy do nagłówka, czy wraz z innymi danymi w ciało żądania.

Czy są jakieś takie kryteria?

Mike Partridge
źródło

Odpowiedzi:

51

Kiedy informacja jest ważna, powinieneś umieścić ją w ciele.

Dlaczego?

  1. serwery proxy mogą modyfikować nagłówki. Wiele z nich jest skonfigurowanych do usuwania nagłówków, których nie znają. Dotyczy to jednak tylko sytuacji, gdy używasz niezaszyfrowanego HTTP. Podczas korzystania z HTTPS serwer proxy nie może zmienić nagłówków, ponieważ są one szyfrowane.
  2. Kiedy korzystasz z usługi internetowej, zazwyczaj robisz to w celu zapewnienia interoperacyjności z innymi urządzeniami, usługami i narzędziami. Większość interfejsów API i narzędzi współpracujących z usługami internetowymi może łatwo zmieniać żądania, ale wiele utrudnia lub wręcz uniemożliwia dodanie niestandardowych nagłówków. Dotyczy to oczywiście tylko sytuacji, w których interoperacyjność stanowi problem. Ale gdy cię to nie obchodzi, możesz zadać sobie pytanie, dlaczego korzystasz z usług internetowych, a nie tylko budować własny protokół na surowym TCP.
Philipp
źródło
WIELKA ODPOWIEDŹ - dwa względy, które mają dla mnie sens, ale nie nauczono mnie wcześniej.
R Claven,
1
IK, to jest stare, ale dołączyłem do tej społeczności, aby głosować za odpowiedzią. Sława.
Jon potasowy
22

Chociaż linia jest nieco rozmyta, dla mnie ogólna zasada brzmi: dane, na których działa logika biznesowa, powinny znajdować się w ciele, metadane mogą / powinny być umieszczone w nagłówkach.

Innym sposobem patrzenia na to jest: dane, które pojawiają się tylko w określonych rodzajach żądań, powinny znajdować się w ciele, podczas gdy dane, które są przetwarzane konsekwentnie w całej aplikacji, powinny znajdować się w nagłówkach.

Jeszcze inny punkt widzenia: czy możesz sobie wyobrazić, że część danych jest przetwarzana globalnie, np. Przez router / zaporę ogniową, a nie przez twoją aplikację? Jeśli tak, to prawdopodobnie powinien on znajdować się w nagłówkach, a nie w treści.

Oto niektóre przykłady zastosowania tych reguł:

  • Poświadczenia bezpieczeństwa przechodzą w nagłówki, ponieważ najprawdopodobniej będą obsługiwane tak samo we wszystkich miejscach aplikacji; na poziomie implementacji prawdopodobnie pojawi się filtr odrzucający żądania bez prawidłowych poświadczeń, niezależnie od faktycznego punktu końcowego obsługującego żądanie, na wypadek, gdyby przeszedł przez filtr.
  • Jeśli z drugiej strony masz punkt końcowy, który pozwala administratorowi dodawać użytkowników do systemu, login użytkownika, który ma zostać utworzony, powinien znajdować się w treści żądania, ponieważ: a) jest obsługiwany przez logikę biznesową aplikacji, b) pojawia się w tym konkretnym punkcie końcowym, ale nie w innych.
  • Opcje kontrolujące buforowanie mogą dobrze pasować do nagłówków (chyba że buforowanie jest podstawową częścią logiki biznesowej aplikacji).

Wracając do pytania dotyczącego unikalnego identyfikatora urządzenia: jeśli jest używane wszędzie w spójny sposób, np. Tylko do logowania, można je umieścić w nagłówkach. Ale jeśli jest używany do filtrowania żądań na różne sposoby w zależności od punktu końcowego, lepiej byłoby w ciele. Oczywiście, jeśli masz oba przypadki użycia, prawdopodobnie lepiej jest trzymać się tylko jednego sposobu przekazywania (prawdopodobnie nagłówków), niż zmuszać użytkownika interfejsu API do umieszczania tych samych danych w dwóch miejscach, co daje dylemat: niespójne dane wejściowe lub wdrożenie pewnego rodzaju walidacji.

Michał Kosmulski
źródło
0

Treść żądania klienta; które nie zostaną zmienione w ramach wielu żądań do tego samego serwera, będą częścią HEADER, np. poświadczenia, inne, które są często zmianami na żądanie, będą częścią BODY.

LUB

właściwość treści wiadomości / treści przejdzie do nagłówka. np. typ kodowania, długość treści, typ zawartości.

I

W twoim przypadku należy dodać parametry filtru jako parametry zapytania / żądania w adresie URL.

/mobiles?type=MOTO&colour=black

W usługach restful sam adres URL będzie odnosił się do obiektu

/conferences/{conference_id} -> odnosi się do konkretnej konferencji

Kanagavelu Sugumar
źródło
Czy to cytat? Skąd ? Dlaczego to sugerujesz? Wprowadź zmiany w swojej odpowiedzi, aby było lepiej.
Machado,