Apakah saya memerlukan header tipe konten untuk permintaan HTTP GET?

154

Sejauh yang saya mengerti ada dua tempat untuk mengatur tipe konten:

  1. Klien menetapkan tipe konten untuk tubuh yang ia kirim ke server (misalnya untuk posting)
  2. Server menetapkan tipe konten untuk respons.

Apakah ini berarti saya tidak harus atau tidak harus menetapkan tipe konten untuk semua permintaan saya (sisi klien). Dan jika saya bisa atau harus jenis konten apa itu?

Saya juga membaca dalam beberapa posting bahwa tipe konten klien menentukan jenis konten apa yang ingin diterima oleh klien. Jadi mungkin poin saya 1 tidak benar?

Martin Flucka
sumber

Jawaban:

112

Menurut bagian RFC 7231 3.1.5.5 :

Seorang pengirim yang menghasilkan pesan yang berisi badan muatan HARUS menghasilkan bidang header Jenis-Konten dalam pesan itu kecuali jika jenis media yang dimaksud dari representasi terlampir tidak diketahui pengirim. Jika bidang header Tipe Konten tidak ada, penerima MUNGKIN dapat mengambil jenis media "application / octet-stream" ( [RFC2046], Bagian 4.5.1 ) atau memeriksa data untuk menentukan jenisnya.

Ini berarti bahwa Content-Typetajuk HTTP harus ditetapkan hanya untuk PUTdan POSTpermintaan.

Epoc
sumber
5
@ Epoc, Pesan yang dikutip paling tidak implisit. Itu tidak benar-benar mengatakan bahwa pesan tanpa badan-entitas SHOULD NOTtermasuk Tipe-Konten. Apakah kami memiliki kutipan eksplisit?
Pacerier
1
@Pacerier tolong jangan mencabut kesimpulan inti dari jawaban orang lain, meskipun itu salah. Saya setuju bahwa jawaban Epoc salah - tidak ada di bagian yang ia kutip yang mendukung kesimpulan jawabannya, dan itu pantas untuk diturunkan. Tetapi itu tidak berarti Anda harus mengedit jawaban untuk menghilangkan premis intinya dan dengan demikian mengubah maknanya.
Mark Amery
8
Saya pikir kalian membaca kata-kata @ Epoc secara harfiah. Tentu, bagian yang dikutip tidak berarti apa yang dikatakannya. Tapi saya pikir kesimpulannya benar dalam konteks pertanyaan OP. OP sedang mencari kejelasan kapan masuk akal untuk memasukkan Tipe-Konten dan kapan tidak. Epoc memberikan informasi tentang bagaimana header digunakan, dan menarik kesimpulan bahwa setiap pengembang yang masuk akal akan: Anda "harus" menggunakan tipe konten untuk permintaan yang memiliki badan muatan (terutama PUT dan POST) dan Anda mungkin "seharusnya tidak" menggunakan itu di tempat-tempat di mana itu tidak berguna, seperti MENDAPATKAN atau KEPALA, dll.
JVMATL
1
Pernyataan pos Anda, "Artinya ..." - adalah peregangan.
Adrian Bartholomew
64

Dapatkan permintaan tidak boleh memiliki tipe konten karena mereka tidak memiliki entitas permintaan (yaitu, badan)

Dmitry Negoda
sumber
31
@Dmitry, Kutipan diperlukan , kalau tidak, itu berdiri sebagai asumsi, bukan sebagai fakta.
Pacerier
6
Meskipun saya setuju bahwa spek tersebut tidak mengatakan Anda tidak dapat memiliki Tipe-Konten pada GET, .Net tampaknya menerapkannya dalam HttpClient. Lihat stackoverflow.com/questions/10679214/...
Adam
27

Jawaban yang diterima salah. Kutipan itu benar, pernyataan bahwa PUT dan POST harus memilikinya salah. Tidak ada persyaratan bahwa PUT atau POST sebenarnya memiliki konten tambahan. Juga tidak ada larangan terhadap GET yang benar-benar memiliki konten.

RFC mengatakan dengan tepat apa artinya. IFF pihak Anda (klien ATAU server asal) akan mengirimkan konten tambahan, di luar tajuk HTTP, ia HARUS menentukan tajuk Jenis-Konten. Namun perlu diperhatikan untuk menghilangkan Tipe-Konten dan masih menyertakan konten (misalnya, dengan menggunakan header Panjang-Konten).

pengguna4157069
sumber
0

Jawaban singkat: Kemungkinan besar, tidak, Anda tidak perlu header tipe konten untuk permintaan HTTP GET. Tetapi spesifikasi tampaknya tidak mengesampingkan header tipe konten untuk HTTP GET, baik.

Bahan pendukung:

  1. "Tipe Konten" adalah bagian dari metadata representasi (yaitu payload). Dikutip dari RFC 7231 bagian 3.1 :

    3.1. Metadata Representasi

    Bidang tajuk representasi menyediakan metadata tentang representasi. Saat pesan menyertakan badan muatan, bidang tajuk representasi menjelaskan cara menafsirkan data representasi yang disertakan dalam badan muatan. ...

    Bidang header berikut menyampaikan metadata representasi:

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

    Dikutip dari RFC 7231 bagian 3.1.1.5 (omong-omong, jawaban yang dipilih saat ini memiliki kesalahan ketik pada nomor bagian):

    Bidang header "Tipe Konten" menunjukkan jenis media dari representasi terkait

  2. Dalam arti itu, Content-Typeheader sebenarnya bukan tentang permintaan HTTP GET (atau permintaan POST, dalam hal ini). Ini tentang muatan di dalam permintaan apa pun . Jadi, jika tidak akan ada muatan, tidak perlu ada Content-Type. Dalam praktiknya, beberapa implementasi berjalan terus dan membuat asumsi yang dapat dimengerti. Dikutip dari komentar Adam :

    "Sementara ... spek itu tidak mengatakan kamu tidak bisa memiliki Tipe-Konten pada GET, .Net tampaknya menerapkannya dalam HttpClient. Lihat SO ini & a ."

  3. Namun, secara tegas, spesifikasi itu sendiri tidak mengesampingkan kemungkinan HTTP GET berisi muatan. Dikutip dari RFC 7231 bagian 4.3.1 :

    4.3.1 DAPATKAN

    ...

    Muatan dalam pesan permintaan GET tidak memiliki semantik yang ditentukan; mengirim badan muatan pada permintaan GET dapat menyebabkan beberapa implementasi yang ada menolak permintaan tersebut.

    Jadi, jika HTTP GET Anda memasukkan muatan untuk alasan apa pun, Content-Typetajuk mungkin juga masuk akal.

RayLuo
sumber
-2

Masalah dengan tidak melewati tipe konten pada pesan GET adalah memastikan bahwa tipe konten tidak relevan karena sisi server tetap menentukan konten. Masalah yang saya temui adalah bahwa sekarang ada banyak tempat yang mengatur layanan web mereka menjadi cukup pintar untuk mengambil tipe konten yang Anda lewati dan mengembalikan respons dalam 'tipe' yang Anda minta. Misalnya. kami saat ini mengirim pesan dengan tempat yang default ke JSON, namun, mereka telah mengatur layanan web mereka sehingga jika Anda melewati jenis konten-xml mereka kemudian akan mengembalikan xml daripada standar JSON mereka. Yang saya pikir maju adalah ide bagus

Leeroy
sumber