data-id="1190000004868343">
HTTP レイヤーに注目すると、多くの CIer がコンテンツ ネゴシエーションについてあまり知らないことがわかりました。コンテンツ ネゴシエーションとは何か、そして次期 CodeIgniter 4 でそれを使用する方法について説明しましょう。 。
コンテンツネゴシエーションとは何ですか?
つまり、コンテンツ ネゴシエーションとは、クライアントとサーバーが応答リソースのコンテンツをネゴシエートし、クライアントに最適なリソースを提供することを意味します。コンテンツ ネゴシエーションでは、応答リソースの言語、画像タイプ、エンコード方式が判断の基礎として使用されます (要求ヘッダーに含まれる特定の Accept
フィールドが判断の基礎となります)。 Accept
字段就是判断的基准)。
举个例子,我用 Chrome 访问 Mozilla 的站点,可以看到下面的 HTTP 请求头信息:
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
accept-encoding:gzip, deflate, sdch
accept-language:en-US,en;q=0.8
这些 accept
信息告诉我们浏览器所支持的格式,并提供这些格式的优先级信息(通过 q 的值来确定优先级)。以上信息说明浏览器在所有支持的内容类型中更希望接收 text/html 类型的内容。由于我的浏览器的语言设置是英语,所以 accept-language
accept
メッセージは、ブラウザーでサポートされている形式を示し、これらの形式の優先順位情報を提供します (優先順位は q の値によって決まります)。上記の情報は、ブラウザが、サポートされているすべてのコンテンツ タイプの中で text/html タイプのコンテンツを優先して受信することを示しています。私のブラウザの言語設定は英語であるため、accept- language
リクエスト ヘッダーは、アメリカ英語 (en-US) ページを好むことを示しています。 🎜🎜明らかに、コンテンツ交渉情報を提供しなくてもウェブサイトは機能し続けますし、私たちは長年にわたってそうしてきました。ただし、Web サーバーがコンテンツ ネゴシエーションの一部の形式を処理できるという事実は、通常、私たちがあまり活用するのが得意ではありませんが、サーバーがこの情報を処理できないという意味ではありません。 🎜🎜コンテンツ ネゴシエーションには 2 つの非常に魅力的な用途があります。1 つは複数の言語をサポートするサイト用で、もう 1 つは特定の形式でデータを返すための API インターフェイスです。 🎜🎜コンテンツネゴシエーションを使用する必要がありますか?必ずしもそうとは限りませんが、彼は両刃の剣である可能性があり、彼を使用しないようにアドバイスする人もいれば、スライスしたパンと同じくらい愛らしいと考える人もいます。ただし、使用したい場合は、CodeIgniter でコンテンツ ネゴシエーションを使用するのが簡単です。 🎜🎜簡単な例🎜ここではコンテンツ ネゴシエーションについてはあまり詳しく説明しません (詳細な紹介はユーザー マニュアルに書かれます)。この例では、コンテンツ ネゴシエーションがどのように出力言語を決定するかを簡単に紹介します。
<code>class BaseController extends \CodeIgniter\Controller { protected $language; public function __construct(...$params) { parent::__construct(...$params); $supportedLangs = ['en-US', 'en', 'fr']; $this->language = $this->request->negotiate('language', $supportedLangs); } }</code>
この例は、サイトが英語とフランス語をサポートできることを示しています。サポートされている言語を $supportedLangs
配列に割り当てます。これは、デフォルト言語がアメリカ英語であるが、通常の英語とフランス語であることを示しています。 $negotiate-> language()
メソッドを呼び出して、サポートされている言語タイプを渡すだけで、解析中に正しい HTTP ヘッダーが認識され、最も一致する結果が得られます。配列で定義された優先順位に従って返されます。どちらの言語も一致しない場合は、配列内の最初の言語が使用されます。 $supportedLangs
数组里,预示着默认语言是美式英语,但也支持普通英语和法语,然后简单调用 $negotiate->language()
方法,传递支持的语言类型,解析时就能识别正确的 HTTP 头,然后按照数组里定义的优先级顺序,返回最匹配的结果。如果两种语言都无法匹配,就会使用数组中的第一个语言。
Negotiate 类中的 4 个协商方法分别为:
media() 不同于通常的 Accept
请求头,他可以用来请求不同版本的 html/text,或者音频支持,图像支持,等等。
charset() 不同于 Accept-Charset
请求头,如果没有匹配的话,默认值为 UTF-8。
encoding() 不同于 Accept-Encoding
请求头,可以决定任何客户端支持使用的压缩类型。
language() 不同于 Accept-Language
Accept
リクエスト ヘッダーとは異なり、異なるバージョンの html/ をリクエストするために使用できます。テキスト、または音声サポート、画像サポートなど。
charset() Accept-Charset
リクエスト ヘッダーとは異なり、一致しない場合のデフォルト値は UTF-8 です。
Accept-Encoding
リクエスト ヘッダーとは異なり、クライアントがサポートする圧縮タイプを決定できます。 🎜🎜Accept-Language
リクエスト ヘッダーとは異なります。 🎜🎜🎜🎜 すべてのシナリオでコンテンツ ネゴシエーションが必要なわけではありませんが、これは高品質の API を構築するための強力なツールであり、他の場所でも創造的に使用することができます。 🎜
🎜
以上、CodeIgniter 4 のコンテンツネゴシエーションについて紹介しました。CodeIgniter の内容も含めて、PHP チュートリアルに興味のある友人の参考になれば幸いです。 🎜
🎜
🎜