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!
やるなら事前にエンコードしてから渡しておく必要がありそうだということまで分かった。