Czym dokładnie jest jednostka HTTP?


114

Czy ktoś mógłby mi opisać, czym dokładnie jest jednostka HTTP ?

Czytam dokumentację HTTPClient, ale tak naprawdę nie rozumiem, co to znaczy?


2
Przyszedłem tutaj z tego artykułu na temat HTTP: HTTP: Protokół, który każdy twórca stron internetowych musi znać, jeśli ktoś przychodzi tutaj w poszukiwaniu informacji na ten temat.
Mason240

2
Zwróć uwagę, że termin „jednostka HTTP” nie pojawia się już w najnowszych specyfikacjach HTTP 1.1 . Wygląda na to, że został wycofany. Teraz możemy po prostu użyć „pól nagłówka” i „treści wiadomości”.
Hawkeye Parker

Odpowiedzi:


139

Jednostka HTTP to większość żądania lub odpowiedzi HTTP, składająca się z niektórych nagłówków i treści, jeśli występuje. Wydaje się, że jest to całe żądanie lub odpowiedź bez żądania lub wiersza stanu (chociaż tylko niektóre pola nagłówka są uważane za część jednostki ).

Ilustrować; oto prośba:

POST /foo HTTP/1.1          # Not part of the entity.
Content-Type: text/plain    # ┬ The entity is from this line down...
Content-Length: 1234        # │
                            # │
Hello, World! ...           # ┘

I odpowiedź:

HTTP/1.1 200 OK             # Not part of the entity.
Content-Length: 438         # ┬ The entity is from this line down...
Content-Type: text/plain    # │
                            # │
Response body ...           # ┘

3
Host nie jest polem nagłówka jednostki.
Gumbo,

Myślałem, że jednostka używa &zamiast &. Czy to też nie jest byt? Co za różnica?
CodyBugstein

1
@Imray: &to odwołanie do jednostki znakowej HTML , a nie to samo, co jednostka HTTP .
maerics

2
@lmray: to zupełnie różne podmioty. ;) (Jedna dotyczy kodowania ciągów znaków w tekście HTML , druga dotyczy strukturyzacji informacji, gdy przeglądarka i serwer rozmawiają ze sobą za pośrednictwem protokołu HTTP . Ponadto jeden jest bardziej zagmatwany niż drugi. Lub odwrotnie; - o)
Sz.

6
Zwróć uwagę, że termin „jednostka HTTP” nie pojawia się już w najnowszych specyfikacjach HTTP 1.1 . Wygląda na to, że został wycofany. Teraz możemy po prostu trzymać się „pól nagłówka” i „treści wiadomości”.
Hawkeye Parker

15

Oto 3 proste przypadki:

Przypadek 1. Przesyłasz 3 pliki w jednym żądaniu. Te 3 pliki to 3 jednostki. Każdy z nich ma swój własny, Content-Typektóry wskazuje, jakiego rodzaju jest to plik.

Przypadek 2. Przeglądasz stronę internetową. Przeglądarka pobrała w tle plik html jako jednostkę. Ponieważ strona może być aktualizowana w sposób ciągły, później możesz otrzymać zupełnie inną jednostkę.

Przypadek 3. Masz plik 304 Not Modified. Żaden podmiot nie został przeniesiony.

Jednym słowem, jednostka jest opcjonalnym ładunkiem wewnątrz wiadomości http (żądaniem lub odpowiedzią), więc jest to relacja „ częściowo w całości ” między jednostką a wiadomością.

Niektóre pola nagłówka odnoszą się do Messagepodobnych, Transfer-Encodingopisują, jak przesyłać wiadomości między pośrednikami, a zatem MOGĄ być dodawane lub usuwane przez dowolną aplikację w łańcuchu żądań / odpowiedzi ( hop-by-hop headers). Dla porównania, te pola nagłówka mają zastosowanie do Entityniektórych właściwości, które opisują rozmiar jednostki, typ, algorytm kompresji itp.

Dalsza lektura, cytując z RFC 2616, sekcja 1.4, 4.5 i 4.3:

  • Łańcuch żądań / odpowiedzi
     request chain -------------------------------------->
   UA -----v----- A -----v----- B -----v----- C -----v----- O
      <------------------------------------- response chain

Powyższy rysunek przedstawia trzech pośredników (A, B i C) między agentem użytkownika a serwerem pochodzenia. Komunikat żądania lub odpowiedzi, który przechodzi przez cały łańcuch, przechodzi przez cztery oddzielne połączenia.

  • Pola nagłówka dla wiadomości lub jednostki

Istnieje kilka pól nagłówka, które mają ogólne zastosowanie zarówno do komunikatów żądań, jak i komunikatów odpowiedzi, ale które nie mają zastosowania do przesyłanej jednostki . Te pola nagłówka dotyczą tylko przesyłanej wiadomości .

  • Pola nagłówka wiadomości można zmieniać w łańcuchu

Kodowanie transferu MUSI być używane do wskazywania wszelkich kodowań przesyłania stosowanych przez aplikację w celu zapewnienia bezpiecznego i prawidłowego przesyłania wiadomości. Transfer-Encoding jest właściwością wiadomości, a nie jednostki, a zatem MOŻE być dodawane lub usuwane przez dowolną aplikację w łańcuchu żądania / odpowiedzi.

  • Relacja między treścią wiadomości a treścią jednostki

message-body = Transfer-Encoding( Content-Encoding(entity-body) )

gdzie Transfer-Encodingmoże być „podzielony na fragmenty”, co oznacza, jak przesłać wiadomość, i Content-Encodingmoże być „gzip”, który oznacza, jak skompresować jednostkę.


Wow, dziękuję za wyjaśnienie relacji „część-całość” między bytem a przesłaniem! Reszta trochę pogłębia zamieszanie, ale ogólnie rzecz biorąc, nadal jest warta uznania. Twoje zdrowie!
Sz.

12

Jest to abstrakcja reprezentująca ładunek żądania lub odpowiedzi . JavaDoc jest jasne od jej celu i różnych typów jednostek.


3
+1 za nazwanie go „ładunkiem”, co w końcu dodaje trochę znaczenia temu pustemu terminowi („jednostka”).
Sz.


2

HTTP to protokół, który jest obserwowany podczas uzyskiwania dostępu do informacji ze zdalnej maszyny przez sieć. Zwykle sieć to Internet, a zdalna maszyna to serwer.

Kiedy prosisz osobę A o informacje do osoby B, przekazujesz jej wiadomość. (Żądanie). Osoba B udzieli odpowiedzi (odpowiedź). Żądanie i odpowiedź to typy wiadomości HTTP.

Osoba A może poprosić osobę B o zrobienie czegoś, zamiast prosić o informacje. Powiedzmy, że osoba A chce, aby osoba B przechowywała plik w bezpiecznej lokalizacji. Zatem osoba A przekazuje ten plik (jednostkę HTTP) osobie B i prosi ją o zrobienie czegoś (wiadomość HTTP). W tym przypadku Osoba przechodzi obok „Podmiotu”. W kontekście jednostki HTTP jest to ładunek dołączony do wiadomości.

Mam nadzieję, że ta analogia pomogła.


2

Jak powiedziano w komentarzu @ hawkeye-parker, wygląda na to, że jednostka Entity została wycofana. Dodać do poszukiwania w tym dokumencie RFC 2014 , a zobaczysz o podmiotach XML oraz treści wiadomości, ale nic o podmiocie HTTP.

Niemniej jednak HttpClient, ale także klient JaxRS, mają metodę setEntity()i getEntity().

Biorąc pod uwagę zaakceptowaną odpowiedź, obie biblioteki się mylą! HttpClient.setEntity()nie usunie wcześniej ustawionych nagłówków.


Zauważyłem, że rozróżnienie „Jednostka” (i powiązane „nagłówki encji”) i „Wiadomość” jest całkiem przydatne. Staje się to szybko widoczne, gdy projektujesz bibliotekę sieciową i przeprowadzasz analizę wiadomości HTTP i jej różnych wcieleń, np. Wiadomości wieloczęściowej. Niestety, nowe specyfikacje RFC łączą te odrębne „klasy” w jedną i musimy wprowadzić własną terminologię lub trzymać się „jednostki”.
CouchDeveloper

1

HttpEntityjest tym, co zamierzasz przekazać w żądaniu (z nagłówkiem) i co otrzymujesz w odpowiedzi. Dla Get Request przekazujemy prosty ciąg znaków

 HttpHeaders headers = new HttpHeaders();
 headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
 HttpEntity<String> entity = new HttpEntity<String>(headers);

Do postu Zdamy pełną klasę Entity

public String createProducts(@RequestBody Product product) {
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<Product> entity = new HttpEntity<Product>(product,headers);

    return restTemplate.exchange(
             "http://localhost:8080/products", HttpMethod.POST, entity, String.class
           ).getBody();
}

0

Encja jest czymś w rodzaju wiadomości, składa się z nagłówka, w którym znajdują się metadane, takie jak lokalizacja, język, kodowanie ...

I opcjonalnie body - zawartość jest sformatowana itp. Zgodnie z nagłówkiem


0

Wśród dobrych odpowiedzi, które tu mamy, uważam, że warto wspomnieć o czymś, co pochodzi bezpośrednio z RFC 2616 (Hypertext Transfer Protocol - HTTP / 1.1) :

Jednostka

Komunikaty żądań i odpowiedzi MOGĄ przenosić jednostkę, jeśli nie jest to inaczej ograniczone przez metodę żądania lub kod statusu odpowiedzi. Encja składa się z pól nagłówka encji i treści encji, chociaż niektóre odpowiedzi będą zawierać tylko nagłówki encji.

W skrócie: jednostka może zostać przeniesiona i może to być nagłówek + treść lub tylko nagłówek .

Ponieważ istnieje powyższy link, powstrzymuję się od robienia dodatkowych komentarzy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.