CakePHP4.2 で Http get する
記事の本質は、「オープンソースならコードよんじゃえ♪」でオナシャス!
といっても、それだけ言えば公式ドキュメント見れば即終了する。
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 調べてみる
そして該当ライブラリは 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!
やるなら事前にエンコードしてから渡しておく必要がありそうだということまで分かった。