中卒派遣30代ブサメン童貞のブログ

みんなが存在に疑問を感じている「中卒、派遣、30歳超えのブサメン童貞」が実際に生息し、そして「どうやって生きてるか」を晒していくブログ

それにつけても cURL

変数をセット

外出する前にはバッグを用意します。バッグの中にはクリアファイルと財布が入っています。クリアファイルの中には書類が何枚、財布の中にはコンドー……というわけで、何をするにせよ準備が大事。ちゃんと体は洗った?きょうのform.phpです。

<?php

$ma = "";

// POSTされたデータか確認
if ($_SERVER['REQUEST_METHOD'] === "POST") {
  $ma = $_POST['ma'];
}

// リクエスト先URL
$url = "https://corevo/goolab/api?apikey=";

// APIキーのセット
$key = "a1b2c3d4e5f6g7h8u9j0";

// 送信するデータの準備
$postdata = array(
  'sentence' => $ma
);

まずはPOST経由のアクセスではないときにNoticeエラーを出させないための変数宣言を行います。どうせ配列が入ることを前提にした変数なので$ma = array();も試してみたのですが、エラーを吐くことなく普通に動きました。ただ、あまり目にしません。なぜ?教えてエロい人。

続いてのリクエスト先URLとAPIキーはcorevo APIのDocumentationから拾ってきて、それぞれを変数に代入します。ここまでは頭の悪い僕でもおおよそ理解できます。ちなみに、当然ですが上記のURLとAPIキーはフェイクです。ファーwww

そして送信するデータを配列で用意します。キーはパラメータ名。今回は必須のパラメータがsentenceだけ、ほかは省略すると全指定されたことになるので、とりあえず都合のいいように書きます。どうせあたしは都合のいい女よ。

cURL を使う

通常はPHPでHTTPリクエストを扱う場合file_get_contents()を使うことが多いらしく、BOOKOFFで立ち読みしたバリバリに貼り付いたPHP教本も、そのやり方でXMLを取得していました。が、cURLのほうがパフォーマンスが高いとか、細かい設定をするには向いているとか、昨今ではcURL勢力のステマPHP界隈で猛威をふるっているようです。事なかれ主義の僕としては、おとなしく右に倣うことにします。

cURLの基本的な流れは以下のようになるらしいです。

curl_init()により cURL セッションを初期化
curl_setopt() により転送時のオプションを設定
curl_exec() により転送を実行
curl_close() によりセッションを終了する

PHP: 基本的な curl の使用法 - Manual

上記の流れをそのままトレスしてみます。今回は転送時のオプションを複数設定するのでcurl_setopt_array()を使いますが、curl_setopt()で個別に書いても動きます。何を隠そう、最初はひとつひとつ書いていました。

<?php

// CURLセッションの初期化
$ch = curl_init();

// CURLオプションの設定
$options = array (
  // 取得するURL
  CURLOPT_URL => $url .$key,

  // リクエストヘッダをJSONに設定
  CURLOPT_HTTPHEADER => array ("Content-Type: application/json"),

  // HTTPリクエストをPOSTに設定
  CURLOPT_CUSTOMREQUEST => "POST",

  // POSTするデータ
  CURLOPT_POSTFIELDS => json_encode($postdata),

  // trueでcurl_exec()の返り値を文字列で返す
  CURLOPT_RETURNTRANSFER => true,
);

curl_setopt_array($ch, $options);

// 転送を実行し変数に代入
$result = curl_exec($ch);

// CURL処理を終了
curl_close($ch);

基本的にコメントのまんまです。json_encode()API側に渡したいデータをJSONエンコードCURLOPT_POSTFIELDSはURLエンコードされた文字列を渡さないとapplication/x-www-form-urlencodedになりません。またcurl_exec()はブール値で返ってくるのでtrueを指定して文字列で受け取るようにします。