HTTPリクエストの操作

CodeIgniterを最大限に活用するためには、HTTPリクエストとレスポンスがどのように機能するかについての基本的な理解が必要です。これはWebアプリケーション開発中に扱うものであるため、HTTPの背後にある概念を理解することは、成功したいすべての開発者にとって必須です。

この章の最初の部分では、概要を説明します。概念を理解した上で、CodeIgniter内でリクエストとレスポンスを操作する方法について説明します。

HTTPとは?

HTTPは、2つのマシンが相互に通信できるようにする、単なるテキストベースの規約です。ブラウザがページをリクエストすると、サーバーにページを取得できるかどうかを尋ねます。次に、サーバーはページを準備し、それをリクエストしたブラウザに応答を返信します。ほぼそれだけです。明らかに、使用できる複雑なものがいくつかありますが、基本は非常に簡単です。

HTTPは、その交換規約を記述するために使用される用語です。これはHyperText Transfer Protocolの略です。Webアプリケーションを開発する際の目標は、ブラウザが何を要求しているかを常に理解し、適切に応答できるようにすることです。

リクエスト

クライアント(Webブラウザ、スマートフォンアプリなど)がリクエストを行うたびに、クライアントは小さなテキストメッセージをサーバーに送信し、応答を待ちます。

リクエストは次のようになります。

GET / HTTP/1.1
Host codeigniter.com
Accept: text/html
User-Agent: Chrome/46.0.2490.80

このメッセージには、クライアントが何を要求しているかを知るために必要なすべての情報が表示されます。リクエストのメソッド(GET、POST、DELETEなど)、およびサポートするHTTPのバージョンを示します。

また、リクエストには、クライアントがコンテンツを表示したい言語、クライアントが受け入れる形式の種類など、さまざまな情報を含むことができる多くのオプションのリクエストヘッダーが含まれています。Wikipediaには、確認したい場合にすべてのヘッダーフィールドをリストした記事があります。

レスポンス

サーバーがリクエストを受信すると、アプリケーションはその情報を取得して何らかの出力が生成されます。サーバーは、その出力をクライアントへの応答の一部としてバンドルします。これも、次のような単純なテキストメッセージとして表されます。

HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 05 Nov 2015 05:33:22 GMT
Content-Type: text/html; charset=UTF-8

<html>
    . . .
</html>

レスポンスは、クライアントが使用しているHTTP仕様のバージョンと、おそらく最も重要なステータスコード(200)をクライアントに伝えます。ステータスコードは、クライアントにとって非常に具体的な意味を持つように標準化された多数のコードの1つです。これにより、成功した(200)ことや、ページが見つからなかった(404)ことを伝えることができます。HTTPステータスコードの完全なリストについては、IANAにアクセスしてください。

リクエストとレスポンスの操作

PHPはリクエストヘッダーとレスポンスヘッダーを操作する方法を提供していますが、ほとんどのフレームワークと同様にCodeIgniterはそれらを抽象化し、一貫性のあるシンプルなインターフェイスを提供します。IncomingRequestクラスは、HTTPリクエストのオブジェクト指向表現です。必要なすべてを提供します。

<?php

use CodeIgniter\HTTP\IncomingRequest;

$request = request();

// the URI path being requested (i.e., /about)
$request->getUri()->getPath();

// Retrieve $_GET and $_POST variables
$request->getGet('foo');
$request->getPost('foo');

// Retrieve from $_REQUEST which should include
// both $_GET and $_POST contents
$request->getVar('foo');

// Retrieve JSON from AJAX calls
$request->getJSON();

// Retrieve server variables
$request->getServer('Host');

// Retrieve an HTTP Request header, with case-insensitive names
$request->header('host');
$request->header('Content-Type');

// Checks the HTTP method
$request->is('get');
$request->is('post');

リクエストクラスは、ユーザーが心配する必要のない、多くの処理をバックグラウンドで実行します。isAJAX()メソッドとisSecure()メソッドは、正しい答えを判断するためにいくつかの異なる方法をチェックします。

注釈

isAJAX()メソッドは、X-Requested-Withヘッダーに依存しますが、場合によってはJavaScript(つまり、fetch)を介したXHRリクエストでデフォルトで送信されないことがあります。この問題を回避する方法については、AJAXリクエストのセクションを参照してください。

CodeIgniterは、HTTPレスポンスのオブジェクト指向表現であるResponseクラスも提供します。これにより、クライアントへの応答を簡単かつ強力に構築できます。

<?php

use CodeIgniter\HTTP\Response;

$response = response();

$response->setStatusCode(Response::HTTP_OK);
$response->setBody($output);
$response->setHeader('Content-Type', 'text/html');
$response->noCache();

// Sends the output to the browser
// This is typically handled by the framework
$response->send();

さらに、Responseクラスを使用すると、最高のパフォーマンスを得るためにHTTPキャッシュレイヤーを操作できます。