HTTPリクエストのカスタマイズ

HTTPヘッダの作成

HTTPプロトコルのコンテキストの記述から、stream_context_create()でコンテキストリソースを作成します。そしてそれをfile_get_contents()の引数とすることで、UserAgentなどの任意のHTTPヘッダを設定することが可能です。

複数の情報を指定する場合には、それぞれを改行コード (\r\n) で区切り連結します。

$options = array(
    'http'=>array(
        'method'=>'GET',
        'header'=>"User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n".
                  "Accept-language: ja\r\n"
    )
);

$context = stream_context_create( $options );
$contents = file_get_contents( 'http://example.com', FALSE, $context );

なおヘッダ情報を指定せずにfile_get_contents()を使用したときには、HTTPの要求メッセージは

GET / HTTP/1.0\r\n
Host: www.yahoo.com\r\n
\r\n

のようになります。(PHP 5.2.8において、Microsoft Network Monitorにて確認)

クッキーをヘッダに含める方法

前述の方法を用いれば、リクエストにクッキーの情報を含められます。

$options = array(
    'http'=>array(
        'method'=>'GET',
        'header'=>'Cookie: name1=value1; name2=value2\r\n'
    )
);

POSTメソッド

POSTメソッドを使用する場合、データがテキストならばヘッダに「Content-Type: application/x-www-form-urlencoded」を含める必要があります。

$url = 'http://example.com/';
$queries = array( 'a'=>1, 'b'=>2 );

$headers = array(
    'Content-Type: application/x-www-form-urlencoded',
    'Content-Length: '.strlen( http_build_query( $queries ) )
    );

$options = array(
    'http'=>array(
        'method'=>'POST',
        'header'=>implode( "\r\n", $headers ),
        'content'=>http_build_query( $queries )
        )
    );

// ストリームコンテキストの作成
$stream = stream_context_create( $options );

// ファイルのオープン
$contents = file_get_contents( $url, FALSE, $stream );

cURL

同様の処理をcURLで行うなら、

$url = 'http://example.com/';
$queries = array( 'a'=>1, 'b'=>2 );

$curl = curl_init( $url );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt( $curl, CURLOPT_POSTFIELDS, http_build_query( $queries ) );

$response = curl_exec( $curl );
curl_close( $curl );

のようになります。このときもデータがテキストの場合には、http_build_query()などで先にデータを文字列に変換する必要があります。さもなくばContent-Typeがmultipart/form-dataとなり、バイナリとして処理されてしまいます。