uiuifree.com

- サイト制作のノウハウと最適化を目指して-

2020.9.8【PHP】curlのGET/POSTまとめ

【PHP】curlのGET/POSTまとめ

PHPで外部のサイトやAPIにアクセスする際に使われる手段としてcurlがあります。 cURLはサイトアクセスだけでなく多くのプロトコルに対応しており、FTP、FTPS、GOPHER、HTTP、HTTPS、LDAP、LDAPS、SCP、SFTP、IMAP、POP3、POP3S、SMTP、SMTPS、RTSPもサポートしています。FTP観覧も対応しているってことはファイルサーバーにアップロードをする手段とかもあるようです。

ちなみにcURLをシーユーアルエルと読んでいる現場も多いですが正確にはカールと読むそうです。

GET/POST

POST
$params= [
    'foo' => 'bar'
]
$header = [
   // headerに追加したい情報
  // 例)
  //  "Content-Type: application/json",
  // "Accept: application/json",
  // "Authorization: Bearer HogeHoge" 
];

$curl=curl_init();
curl_setopt($curl,CURLOPT_URL, 'http://hogehoge');
curl_setopt($curl,CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, FALSE);  // 証明書の検証を無効化
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, FALSE);  // 証明書の検証を無効化 
curl_setopt($curl,CURLOPT_RETURNTRANSFER, TRUE); // 返り値を文字列に変更
curl_setopt($curl,CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡

$output= curl_exec($curl);

// エラーハンドリング用
$errno = curl_errno($curl);
// コネクションを閉じる
curl_close($curl);

// エラーハンドリング
if ($errno !== CURLE_OK) {
  //エラー処理
}

echo output;   
GET
$header = [
   // headerに追加したい情報
  // 例)
  //  "Content-Type: application/json",
  // "Accept: application/json",
  // "Authorization: Bearer HogeHoge" 
];

$curl=curl_init();
curl_setopt($curl,CURLOPT_URL, 'http://hogehoge?test=1');
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, FALSE);  // 証明書の検証を無効化
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, FALSE);  // 証明書の検証を無効化 
curl_setopt($curl,CURLOPT_RETURNTRANSFER, TRUE); // 返り値を文字列に変更
curl_setopt($curl,CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡

$output= curl_exec($curl);

// エラーハンドリング用
$errno = curl_errno($curl);
// コネクションを閉じる
curl_close($curl);

// エラーハンドリング
if ($errno !== CURLE_OK) {
  //エラー処理
}

echo output;   

その他 よく使うパラメータ ー

user-agentを変更

curl_setopt($curl,CURLOPT_USERAGENT,      "USER_AGENT");

接続元URLを変更

curl_setopt($curl,CURLOPT_REFERER,        "REFERER"); 

Cookueの保存先を変更

$tmpFile = '/tmp/cookie';
curl_setopt($curl,CURLOPT_COOKIEJAR,      $tmpFile);
curl_setopt($curl,CURLOPT_COOKIEFILE,     $tmpFile);

エラーコードの種類

エラーコード 意味
CURLE_OK 正常処理
CURLE_UNSUPPORTED_PROTOCOL サポートされていないプロトコルが選択されました
CURLE_FAILED_INIT 内部エラーなどにより初期化コードに失敗しました、
CURLE_URL_MALFORMAT URLの形式が正しくない
CURLE_URL_MALFORMAT_USER
CURLE_COULDNT_RESOLVE_PROXY プロキシを解決できませんでした
CURLE_COULDNT_RESOLVE_HOST ホストを解決できませんでした。指定されたリモートホストは解決されませんでした。
CURLE_COULDNT_CONNECT ホストまたはプロキシへのconnectに失敗しました。
CURLE_FTP_WEIRD_SERVER_REPLY サーバーが送信したデータをlibcurlは解析できませんでした
CURLE_FTP_ACCESS_DENIED
CURLE_FTP_USER_PASSWORD_INCORRECT
CURLE_FTP_WEIRD_PASS_REPLY
CURLE_FTP_WEIRD_USER_REPLY
CURLE_FTP_WEIRD_PASV_REPLY
CURLE_FTP_WEIRD_227_FORMAT
CURLE_FTP_CANT_GET_HOST
CURLE_FTP_CANT_RECONNECT
CURLE_FTP_COULDNT_SET_BINARY
CURLE_PARTIAL_FILE ファイル転送が予想よりも短いか、または大きかった。これは、サーバーが最初に予想される転送サイズを報告してから、以前に指定されたサイズと一致しないデータを配信するときに発生
CURLE_FTP_COULDNT_RETR_FILE 「RETR」コマンドへの奇妙な応答か、ゼロバイト転送の完了
CURLE_FTP_WRITE_ERROR
CURLE_FTP_QUOTE_ERROR
CURLE_HTTP_NOT_FOUND
CURLE_WRITE_ERROR
CURLE_MALFORMAT_USER
CURLE_FTP_COULDNT_STOR_FILE
CURLE_READ_ERROR
CURLE_OUT_OF_MEMORY メモリ割り当てに失敗しました、深刻な問題
CURLE_OPERATION_TIMEOUTED 操作のタイムアウト
CURLE_FTP_COULDNT_SET_ASCII
CURLE_FTP_PORT_FAILED
CURLE_FTP_COULDNT_USE_REST
CURLE_FTP_COULDNT_GET_SIZE
CURLE_HTTP_RANGE_ERROR
CURLE_HTTP_POST_ERROR
CURLE_SSL_CONNECT_ERROR SSL / TLSハンドシェイクのどこかで問題が発生しました
CURLE_FTP_BAD_DOWNLOAD_RESUME
CURLE_FILE_COULDNT_READ_FILE
CURLE_LDAP_CANNOT_BIND LDAPはバインドできません。LDAPバインド操作が失敗しました。
CURLE_LDAP_SEARCH_FAILED LDAP検索が失敗しました
CURLE_LIBRARY_NOT_FOUND
CURLE_FUNCTION_NOT_FOUND 関数が見つかりません。必要なzlib関数が見つかりませんでした。
CURLE_ABORTED_BY_CALLBACK
CURLE_BAD_FUNCTION_ARGUMENT
CURLE_BAD_CALLING_ORDER
CURLE_HTTP_PORT_FAILED
CURLE_BAD_PASSWORD_ENTERED
CURLE_TOO_MANY_REDIRECTS
CURLE_UNKNOWN_TELNET_OPTION
CURLE_TELNET_OPTION_SYNTAX
CURLE_OBSOLETE
CURLE_SSL_PEER_CERTIFICATE
CURLE_GOT_NOTHING
CURLE_SSL_ENGINE_NOTFOUND
CURLE_SSL_ENGINE_SETFAILED
CURLE_SEND_ERROR
CURLE_RECV_ERROR
CURLE_SHARE_IN_USE
CURLE_SSL_CERTPROBLEM
CURLE_SSL_CIPHER
CURLE_SSL_CACERT
CURLE_BAD_CONTENT_ENCODING
CURLE_LDAP_INVALID_URL
CURLE_FILESIZE_EXCEEDED
CURLE_FTP_SSL_FAILED

エラーコードの情報が足りない場合はこちら https://curl.haxx.se/libcurl/c/libcurl-errors.html

この記事を読んでる人にオススメ

PROFILE

このサイトを運営してるuiuifreeです。
渋谷のベンチャー企業で2年ほど新規事業を担当した後にフリーランスエンジニアにキャリア転換。
求人サイトの開発が多くエンジニア/看護師/保育士などの分野でサイトを運営しています。

アウトプット中の技術

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)