PHPのcurlを卒業して、Guzzleを使う。の巻
Guzzleとは
Guzzleとは、PHPのHTTPクライアントで、HTTPリクエストを簡単に実現することができるライブラリです。
特長
・PSR-7(HTTP message interfaces)準拠!
・同期/非同期通信に対応
・Simple interface for building query strings, POST requests, streaming large uploads, streaming large downloads, using HTTP cookies, uploading JSON data, etc…(引用)
なかなか良さそうです。
Guzzleをつかってみる
使ってみます。composerでライブラリを入手します。
php composer.phar require guzzlehttp/guzzle今回は(今回も)、Laravelで試してみました。
composer.json
{ "name": "laravel/laravel", "description": "The Laravel Framework.", "keywords": ["framework", "laravel"], "license": "MIT", "type": "project", "require": { "php": ">=5.6.4", "laravel/framework": "5.4.*", "laravel/tinker": "~1.0", "laravelcollective/html": "5.4.*", "guzzlehttp/guzzle": "^6.1" }, "require-dev": { // 略 }composer updateを実行して準備完了です。
useして、
とりあえず手を抜いて証明書の検証をしないように設定。
use GuzzleHttp\Client;コード書きます
$client = new Client(); $response = $client->request('GET', 'https://www.yahoo.co.jp/'); echo $response->getStatusCode(); die();エラー
Whoops, looks like something went wrong. (1/1) RequestException cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)調べて見ると、GuzzleはcURLのラッパーとのことで、cURL同様に、SSLの場合証明書の検証を標準でするらしい。
とりあえず手を抜いて証明書の検証をしないように設定。
$client = new Client(); $response = $client->request('GET', 'https://www.yahoo.co.jp/', ['verify' => false]); echo $response->getStatusCode(); die();成功
200
つづいてレスポンスボディを取得してみます。
$client = new Client(); $response = $client->request('GET', 'https://www.yahoo.co.jp/', ['verify' => false]); echo $response->getBody(); die();またもやエラー。ちゃんとドキュメント見て書いたのに!
(1/1) ErrorException Object of class GuzzleHttp\Psr7\Response could not be converted to stringどうやらオブジェクトが返ってきているようなので、確認してみる。
$client = new Client(); $response = $client->request('GET', 'https://www.yahoo.co.jp/', ['verify' => false]); echo get_class($response->getBody()); die();あー。そりゃそうやろ。
GuzzleHttp\Psr7\Stream
ということで、PSR側の仕様をよみつつ、StreamInterfaceのgetContentsを実行してみる。
$client = new Client(); $response = $client->request('GET', 'https://www.yahoo.co.jp/', ['verify' => false]); echo $response->getBody()->getContents(); die();成功
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="content-style-type" content="text/css"> <meta http-equiv="content-script-type" content="text/javascript"> <meta name="description" content="日本最大級のポータルサイト。検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。">
ということで、
長くなったので続く。