Czy potrzebuję nagłówka typu content dla żądań HTTP GET?

Z tego co zrozumiałem są dwa miejsca gdzie można ustawić typ treści:

  1. klient ustawia typ zawartości dla ciała, które wysyła na serwer (np. dla postu)
  2. Serwer ustawia typ treści odpowiedzi.

Czy to oznacza, że nie muszę lub nie powinienem ustawiać typu zawartości dla wszystkich moich żądań get (po stronie klienta). A jeśli Mogę lub powinienem, jaki rodzaj treści byłby to?

Również czytałem w kilku postach, że typ treści klienta określa, jakiego typu treści klient chciałby otrzymywać. Więc może mój punkt 1 nie jest w porządku?

Author: lospejos, 2011-04-14

6 answers

Zgodnie z sekcją RFC 7231 3.1.5.5:

Nadawca, który generuje wiadomość zawierającą treść ładunku powinien wygenerować pole nagłówka typu Content w tej wiadomości, chyba że zamierzony typ nośnika załączonej reprezentacji jest nieznany nadawcy. Jeśli pole nagłówka typu Content nie jest obecne, odbiorca może albo przyjąć typ nośnika " application / octet-stream "( [RFC2046], sekcja 4.5.1) lub sprawdzić dane do określ jego typ.

Oznacza to, że nagłówek HTTP Content-Type powinien być ustawiony tylko dla żądań PUT i POST.

 123
Author: Epoc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-20 14:21:53

Żądania Get nie powinny mieć typu content-type, ponieważ nie mają encji request (czyli ciała)

 66
Author: Dmitry Negoda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-14 10:06:50

Żądania GET mogą mieć nagłówki "Accept", które mówią, jakie typy treści klient rozumie. Serwer może wtedy zdecydować, jaki typ treści ma zostać odesłany.

Są jednak opcjonalne.

Http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1

 38
Author: Matthew Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-14 10:19:28

Przyjęta odpowiedź jest błędna. Cytat jest poprawny, twierdzenie, że PUT I POST muszą go mieć, jest nieprawidłowe. Nie ma wymogu, aby PUT lub POST faktycznie miały dodatkową zawartość. Nie ma też zakazu posiadania treści.

RFC mówią dokładnie, co mają na myśli .. iff Twoja strona (klient lub serwer origin) będzie wysyłać dodatkową zawartość, poza nagłówkami HTTP powinna ona określać nagłówek Content-Type. Ale zauważ, że można pominąć Content-Type I still include content (powiedzmy, używając nagłówka Content-Length).

 28
Author: user4157069,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-19 01:59:28

Krótka odpowiedź: najprawdopodobniej nie ty nie potrzebujesz nagłówka typu content dla żądań HTTP GET. Ale specyfikacje nie wydają się wykluczać nagłówka typu treści dla HTTP GET.

Materiały pomocnicze:

  1. "Content-Type" jest częścią metadanych reprezentacji (tj. ładunku). Cytowany z sekcja RFC 7231 3.1:

    3.1. Metadane Reprezentacyjne

    Pola nagłówka reprezentacji dostarczają metadanych o reprezentacyjne. Kiedy wiadomość zawiera ciało ładunku, pola nagłówka reprezentacji opisują jak interpretować dane reprezentacyjne zawarte w korpusie ładunku. ...

    Następujące pola nagłówka przekazują metadane reprezentacji:

    +-------------------+-----------------+
    | Header Field Name | Defined in...   |
    +-------------------+-----------------+
    | Content-Type      | Section 3.1.1.5 |
    | ...               | ...             |
    

    Cytowane z RFC 7231 sekcja 3.1.1.5 (nawiasem mówiąc, obecna wybrana odpowiedź miała literówkę w numerze sekcji):

    Pole nagłówka "Content-Type" wskazuje typ nośnika powiązane reprezentacja

  2. W tym sensie nagłówek Content-Type tak naprawdę nie dotyczy żądania HTTP GET (lub żądania POST lub PUT). Chodzi o ładunek wewnątrz takiego żądania. Tak więc, jeśli nie będzie ładunku, nie trzeba Content-Type. W praktyce niektóre wdrożenia posunęły się naprzód i uczyniły to zrozumiałe założenie. Cytat z komentarza Adama :

    "While ... spec nie mówi, że nie możesz mieć Content-Type NA GET, . Net wydaje się wymuszać to w swoim HttpClient. Zobacz to tak q & A."

  3. Jednak, ściśle mówiąc, sama specyfikacja nie wyklucza możliwości HTTP GET zawiera ładunek. Cytat z RFC 7231 sekcja 4.3.1:

    4.3.1 GET

    ...

    Ładunek w wiadomości żądania GET nie ma zdefiniowanej semantyki; wysłanie ładunku na żądanie GET może spowodować, że niektóre istniejące wdrożenia do odrzucenia Prośba.

    Tak więc, jeśli twój HTTP GET zawiera ładunek z jakiegokolwiek powodu, nagłówek Content-Type jest prawdopodobnie rozsądny.

 2
Author: RayLuo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-09 05:29:59

Problem z nie przekazaniem typu content-type w wiadomości GET polega na tym, że typ content - type jest nieistotny, ponieważ strona serwera i tak określa zawartość. Problem, który napotkałem, polega na tym, że istnieje teraz wiele miejsc, które skonfigurowały swoje usługi internetowe, aby były wystarczająco inteligentne, aby podnieść typ treści, który przekazujesz i zwrócić odpowiedź w "typie", którego żądasz. Np. obecnie komunikujemy się z miejscem, które domyślnie jest JSON, jednak ustawili swoje webservice się tak, że jeśli przekazujesz content-type XML będą wtedy zwracać xml zamiast domyślnego JSON. Co moim zdaniem jest świetnym pomysłem

 -2
Author: Leeroy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-10 23:28:10