HTTP GET istekleri için bir içerik türü başlığına ihtiyacım var mı?


154

Anladığım kadarıyla, içerik türünü ayarlayabileceğiniz iki yer var:

  1. İstemci, sunucuya gönderdiği gövde için bir içerik türü belirler (örneğin, posta için)
  2. Sunucu, yanıt için bir içerik türü ayarlar.

Bu, tüm alma isteklerim için (istemci tarafı) bir içerik türü ayarlamak zorunda olmamam ya da ayarlamamam gerektiği anlamına mı geliyor? Ve eğer yapabilirsem veya yapmalıyım ne tür bir içerik olurdu?

Ayrıca, istemcinin içerik türünün, istemcinin almak istediği içerik türünü belirlediğini birkaç gönderide okudum. Yani belki benim 1. noktam doğru değil?

Yanıtlar:


112

Göre RFC 7231 bölüm 3.1.5.5 :

Yük gövdesi içeren bir mesaj üreten bir gönderici , ekteki sunumun amaçlanan ortam türü gönderen tarafından bilinmiyorsa, bu mesajda bir İçerik Tipi başlık alanı oluşturmalıdır . Eğer bir içerik-Tipi başlık alanı mevcut olmadığında, alıcı ya da "uygulama / sekizli-akış" (bir ortam tipini varsayabilir [RFC2046], Bölüm 4.5.1 ) veya türünü belirlemek için verileri inceleyin.

Content-TypeHTTP üstbilgisinin yalnızca PUTve POSTistekleri için ayarlanması gerektiği anlamına gelir .


5
@Epoc, Alıntılanan mesaj en iyi ihtimalle örtüktür. Bu aslında demiyor öğe gövdesinin olmadan mesajlar olduğunu SHOULD NOTbir Content-Type sayılabilir. Açık bir teklifimiz var mı?
Pacerier

1
@Pacerier, yanlış olsa bile, başka birinin cevabının ana sonucunu çıkarmayın. Epoc'un cevabının yanlış olduğuna katılıyorum - alıntı yaptığı bölümde hiçbir şey cevabının sonucunu desteklemiyor ve reddedilmeyi hak ediyor. Ancak bu, temel öncülünü ortadan kaldırmak ve böylece anlamını tamamen değiştirmek için cevabı düzenlemeniz gerektiği anlamına gelmez.
Mark Amery

8
Sanırım sizler @ Epoc'un sözlerini tam anlamıyla okuyorsunuz. Elbette, alıntı yapılan bölüm onun ne demek istediğini ifade etmez . Ama bence sonuç OP sorusu bağlamında doğru. OP, İçerik Türü'nün ne zaman dahil edileceği ve ne zaman eklenmeyeceği konusunda netlik arar. Epoc, başlığın nasıl kullanıldığı hakkında bilgi verdi ve makul bir geliştiricinin şu sonuca vardı: faydalı yük gövdeleri (çoğunlukla PUT ve POST) olan istekler için bir içerik türü kullanmalısınız "ve muhtemelen kullanmamalısınız" GET veya HEAD, vb. gibi yararlı olmadığı yerlerde
JVMATL

1
Mesaj beyanınız, "Bu demektir." - bir esnektir.
Adrian Bartholomew

64

İstekte içerik (yani bir gövde) olmadığı için alma isteklerinde içerik türü olmamalıdır


31
@Dmitry, Atıf gerekli , aksi takdirde bir varsayım, bir gerçek olarak değil.
Pacerier

6
Spesifikasyonun bir GET'te Content-Type'a sahip olamayacağınızı söylemediğini kabul etsem de, .Net, HttpClient'te bunu zorlamaktadır. Bkz. Stackoverflow.com/questions/10679214/…
Adam


27

Kabul edilen cevap yanlış. Teklif doğrudur, PUT ve POST'un sahip olması gerektiği iddiası yanlıştır. PUT veya POST'un gerçekte ek içeriğe sahip olması gerekmez. GET'in aslında içeriğe sahip olmasına karşı da bir yasak yoktur.

RFC'ler tam olarak ne anlama geldiğini söylerler. Tarafınız (istemci VEYA orijin sunucusu) HTTP üstbilgilerinin ötesinde ek içerik gönderecekse, bir İçerik Türü üstbilgisi belirtmelidir. Ancak, İçerik Türü'nün atlanmasına ve yine de içerik eklenmesine izin verilebileceğini unutmayın (örneğin, bir İçerik Uzunluğu üstbilgisi kullanarak).


0

Kısa cevap: Büyük olasılıkla, hayır HTTP GET istekleri için içerik türü bir üstbilgiye ihtiyacınız yoktur . Ancak, teknik özelliklerin HTTP GET için içerik türü üstbilgisini de dışladığı görülmemektedir.

Destekleyici materyaller:

  1. "İçerik Türü", temsil (yani yük) meta verilerinin bir parçasıdır. Alıntı RFC 7231 bölüm 3.1 :

    3.1. Temsil Meta Verileri

    Temsili üstbilgi alanları, temsille ilgili meta veriler sağlar. Bir mesaj bir yük gövdesi içerdiğinde, temsil başlığı alanları yük gövdesinde bulunan temsil verilerinin nasıl yorumlanacağını açıklar. ...

    Aşağıdaki başlık alanları temsil meta verilerini aktarır:

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

    RFC 7231 bölüm 3.1.1.5'ten (bu arada, seçilen geçerli cevabın bölüm numarasında bir yazım hatası vardı) alıntılanmıştır :

    "İçerik Tipi" başlık alanı, ilişkili sunumun medya türünü belirtir

  2. Bu anlamda, Content-Typebaşlık gerçekten bir HTTP GET isteği (veya bu konu için bir POST veya PUT isteği) ile ilgili değildir. Böyle a içeride yük hakkındadır ne talep ediyorum. Yani, yük olmayacaksa buna gerek yoktur Content-Type. Uygulamada, bazı uygulamalar devam etti ve bu anlaşılabilir varsayımı yaptı. Adam'ın yorumundan alıntı :

    "Spesifikasyon ... bir GET'te Content-Type'a sahip olamayacağınızı söylemese de .Net, HttpClient'e zorlar gibi görünüyor. Bkz. SO q & a ."

  3. Ancak, kesinlikle belirtmek gerekirse, özelliklerin kendisi HTTP GET'in bir yük içerme olasılığını dışlamaz. Alıntı RFC 7231 bölüm 4.3.1 :

    4.3.1 ALIN

    ...

    Bir GET istek mesajındaki bir yükün tanımlanmış bir anlamı yoktur; bir GET isteğine bir yük gövdesi göndermek, mevcut bazı uygulamaların isteği reddetmesine neden olabilir.

    Dolayısıyla, HTTP GET'iniz herhangi bir nedenle bir yük içeriyorsa, bir Content-Typebaşlık da makul olabilir.


-2

Bir GET iletisinde içerik türünü geçmeme sorunu, sunucu tarafı içeriği yine de belirlediğinden içerik türünün alakasız olduğundan emin olunmasıdır. Karşılaştığım sorun, artık web hizmetlerini geçtiğiniz içerik türünü alıp yanıtı istediğiniz 'tür' biçiminde döndürecek kadar akıllı olacak şekilde ayarlayan birçok yer olması. Örneğin. şu anda varsayılan olarak JSON olan bir yerle mesaj gönderiyoruz, ancak xs içerik türünden geçerseniz JSON varsayılanları yerine xml döndürecekleri için web hizmetlerini ayarladılar. Sanırım ileriye gitmek harika bir fikir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.