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-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:
request chain --------------------------------------> UA -----v----- A -----v----- B -----v----- C -----v----- O <------------------------------------- response chainPowyż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-Encodingmoże być „podzielony na fragmenty”, co oznacza, jak przesłać wiadomość, i Content-Encodingmoż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.
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();
}
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.