私のPOSTサービスに対してJSONボディでRESTリクエストを行うとき、私はメッセージヘッダにContent-type: application/json; charset=utf-8
を含めます。このヘッダがないと、サービスからエラーが発生します。 Content-type: application/json
の部分なしで;charset=utf-8
を使うこともできます。
charset=utf-8
は正確に何をしますか?私はそれが文字エンコーディングを指定していることを知っていますが、サービスはそれなしでもうまく動きます。このエンコーディングはメッセージ本文に含めることができる文字を制限しますか?
ヘッダは、コンテンツがエンコードされているものを示しているだけです。コンテンツ自体からコンテンツの種類を推測することは必ずしも可能ではありません。つまり、必ずしもコンテンツを見てそれをどう処理するかを知ることはできません。これがHTTPヘッダの目的であり、受信者にどのような種類のコンテンツを扱っているのかを伝えます。
Content-type: application/json; charset=utf-8
は、コンテンツをJSON形式にし、UTF-8文字エンコードでエンコードするように指定します。 JSONのデフォルトの(唯一の)エンコードはUTF-8であるため、エンコードの指定はJSONにとってやや冗長です。そのため、この場合、受信側サーバーはJSONを扱っていることを知って幸せで、デフォルトではエンコードがUTF-8であると想定しているため、ヘッダーがあってもなくても機能します。
このエンコーディングはメッセージ本文に含めることができる文字を制限しますか?
いいえ。ヘッダーと本文には、必要なものをすべて送信できます。しかし、両者が一致しないと、間違った結果が出る可能性があります。ヘッダーでコンテンツがUTF-8エンコードされているが、実際にLatin1エンコードされたコンテンツを送信していると指定した場合、受信側はLatin1エンコードデータをUTF-8として解釈しようとしてゴミデータを生成する可能性があります。もちろん、Latin1でエンコードされたデータを送信することを指定していて、実際に送信していると指定した場合、はい、Latin1でエンコードできるのは256文字に制限されています。
デフォルトのJSONエンコーディングはUTF-8であるという@ decezeの主張を実証するために...
JSONテキストはUnicodeでエンコードする必要があります。デフォルトのエンコードはUTF-8です。
JSONテキストの最初の2文字は常にASCII文字になるため[RFC0020]、オクテットストリームがUTF-8、UTF-16(BEまたはLE)、またはUTF-8のいずれであるかを判別できます。 32(BEかLE)は最初の4オクテットのヌルのパターンを見ることによって。
00 00 00 xx UTF-32BE 00 xx 00 xx UTF-16BE xx 00 00 00 UTF-32LE xx 00 xx 00 UTF-16LE xx xx xx xx UTF-8
IETF RFC4627 が IETF RFC7158 に置き換えられたことに注意してください。セクション[8.1]では、@Drewが前に引用したテキストを以下のように撤回します。
Implementations MUST NOT add a byte order mark to the beginning of a JSON text.
私は@decezeに完全に同意しますが、私はこれを開発したいと思います "私はサービスからエラーが出ます" 質問の一部、
このようなエラーは http 415 のようになります。
HTTP 415サポートされていないメディアタイプエラー
HTTP 415 Unsupported Media Typeクライアントエラー応答コードは、ペイロード形式がサポートされていない形式であるため、サーバーが要求の受け入れを拒否していることを示しています。
フォーマットの問題は、要求に示されたContent-TypeまたはContent-Encoding、あるいはデータを直接検査した結果である可能性があります。
つまり、 https://stackoverflow.com/a/22643964/914284 に見られるような例です。
Dart httpの実装はその「charset = utf-8」のおかげでバイトを処理するため、応答からバイトを読み取るときに「latin-1」フォールバック文字セットを回避するために、いくつかの実装がこれをサポートしていると確信しています。私の場合、応答本文の文字列の形式が完全に失われるため、バイトエンコードを手動でutf8に行うか、サーバーのAPI応答にそのヘッダー「内部」パラメーターを追加する必要があります。