技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

CakePHP4.2 で Http get する

記事の本質は、「オープンソースならコードよんじゃえ♪」でオナシャス!

といっても、それだけ言えば公式ドキュメント見れば即終了する。

book.cakephp.org

use Cake\Http\Client;

$http = new Client();
$response = $http->get('http://example.com/search', ['q' => 'widget']);

わかりやすっ

// 文字列としてレスポンス全体を読み込み
$response->getStringBody();

// レスポンスボディーを含む Psr\Http\Message\StreamInterface を取得
$stream = $response->getBody();

// 何らかの XML を取得
$http = new Client();
$response = $http->get('http://example.com/test.xml');
$xml = $response->getXml();

// 何らかの JSON を取得
$http = new Client();
$response = $http->get('http://example.com/test.json');
$json = $response->getJson();

// 連想配列として全てのヘッダーを取得
$response->getHeaders();

// 配列として単一のヘッダーを取得
$response->getHeader('content-type');

// 文字列としてヘッダーを取得
$response->getHeaderLine('content-type');

// レスポンスのエンコーディングを取得
$response->getEncoding();

// 全てのヘッダーの key=>value の配列を取得
$response->headers;

でもそんなのはドキュメントの焼き直しでしかなくて、では URL パラメータに 'hoge' => 'fuga&test=value' と意地悪したらどういったクエリが出るのでしょうか?
としたときに、公式ドキュメントになかったら自分は何を見るか?

コード読めばいいじゃない

ビバ!オープンソースぅ!

ってことで github 調べてみる

github.com

そして該当ライブラリは Http/Client.php ということで get を探しませう。

cakephp/Client.php at 4.2.2 · cakephp/cakephp · GitHub

    public function get(string $url, $data = [], array $options = []): Response
    {
        $options = $this->_mergeOptions($options);
        $body = null;
        if (is_array($data) && isset($data['_content'])) {
            $body = $data['_content'];
            unset($data['_content']);
        }
        $url = $this->buildUrl($url, $data, $options);

        return $this->_doRequest(
            Request::METHOD_GET,
            $url,
            $body,
            $options
        );
    }

$data が URL パラメータなので、ビルドしてるのは buildUrl

    public function buildUrl(string $url, $query = [], array $options = []): string
    {
        if (empty($options) && empty($query)) {
            return $url;
        }
        if ($query) {
            $q = strpos($url, '?') === false ? '?' : '&';
            $url .= $q;
            $url .= is_string($query) ? $query : http_build_query($query);
        }

第二パラメータは文字列でもいいのか、文字列を入れるとそのままリクエストするのね…

http_build_query は標準 API のようだ。

PHP: http_build_query - Manual

文字コードエンコーディングはしないのかYO!
やるなら事前にエンコードしてから渡しておく必要がありそうだということまで分かった。