Czy ktoś mógłby mi opisać, czym dokładnie jest jednostka HTTP ?
Czytam dokumentację HTTPClient, ale tak naprawdę nie rozumiem, co to znaczy?
Czy ktoś mógłby mi opisać, czym dokładnie jest jednostka HTTP ?
Czytam dokumentację HTTPClient, ale tak naprawdę nie rozumiem, co to znaczy?
Odpowiedzi:
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 ... # ┘
&
zamiast &
. Czy to też nie jest byt? Co za różnica?
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-Type
któ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 Message
podobnych, Transfer-Encoding
opisują, 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 Entity
niektó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:
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.
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 .
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.
message-body = Transfer-Encoding( Content-Encoding(entity-body) )
gdzie Transfer-Encoding
może być „podzielony na fragmenty”, co oznacza, jak przesłać wiadomość, i Content-Encoding
może być „gzip”, który oznacza, jak skompresować jednostkę.
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.
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.
HttpEntity
jest 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();
}
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
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.