ゆっくり開発

開発したい時に開発するブログ

PHPで簡単なAPIのモックを作る

PHPに触るきっかけ作り

Web関係のプログラムでNode(JavaScript)やPythonを触ったことはあるが, 未だにPHPのコードは一度も書いたことがないし,まともにコードを読んだことがない.
かつ,最近,アルバイト先でPHP需要が高まってる雰囲気がある.
そもそもWeb系といえばまずPHPっていう気もする.
なので,PHPをちょっとずつ勉強していきたい.

APIのモックの開発でPHPデビューする

Webページ(アプリ)のフロントエンドを開発する際, 開発してるページからまだ開発していないAPIを叩きたい時がある.
こんな時のため,とりあえず受け答えだけしてくれるような簡易版のサーバー(APIのモックサーバー)があると便利.
今回はPHPデビューのためにも,APIのモックをPHPで作成する.

実装内容

今回は今作ってるWebページで必要なGETとPOSTを受けてくれるサーバーを作る.
また,受け渡しするデータはJSONデータを想定している.
具体的な実装内容は,以下の通り.

  • GET
    • クライアントはクエリなしでGET
    • サーバーは決め打ちのJSONデータを返却
  • POST
    • クライアントは適当なJSONをPOST
    • サーバーは受け取ったJSONをそのまま返却

今回のソースコード

今回書いたソースコードは最終的にこんな感じになりました.

<?php
// Origin null is not allowed by Access-Control-Allow-Origin.とかのエラー回避の為、ヘッダー付与
header('Access-Control-Allow-Origin: *');

function api4leaflet () {
  // GET用のjson
  $spots = [
    [
      'name' => 'スポット1',
      'category' => 'A',
      'lat' => '34.598804',
      'lng' => '133.76884'
    ],
    [
      'name' => 'スポット2',
      'category' => 'B',
      'lat' => '34.606323',
      'lng' => '133.793363'
    ],
    [
      'name' => 'スポット3',
      'category' => 'A',
      'lat' => '34.61858',
      'lng' => '133.759183'
    ]
  ];

  switch ($_SERVER['REQUEST_METHOD']) {
    case 'GET':
      echo json_encode($spots, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
      break;
    case 'POST':
      echo json_encode(file_get_contents('php://input'), JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
      break;
    default:
      echo 'unexpected request';
      break;
  };
}

switch ($_SERVER['REQUEST_URI']) {
  case '/leaflet':
    api4leaflet();
    break;
  default:
    echo 'unexpected URI';
    break;
}

実行コマンド

以下のコマンドで実行しています.
$ php -S 127.0.0.1:5000 api_mock.php
この場合,ブラウザなどからhttp://127.0.0.1:5000にアクセスすることで, サーバーにアクセスできます.

各コードについて

Headerとかはよく調べてなくて,人のコードそのままパクっていますが, その他のコードの意味は以下の通り.

  • $_SERVER['REQUEST_URI']
    サーバーのルート以下のパスが入っています.
    例えば,http://127.0.0.1:5000/leafletにアクセスした場合, この変数には文字列/leafletが格納されます.
  • $_SERVER['REQUEST_METHOD']
    実行したAPIの種類が入っています. GETPOSTといった文字列がそのまま入っています.
  • file_get_contents('php://input')
    これでクライアントが送ってきたbodyが取り出せるっぽい.
  • json_encode($spots, なんやかんや);
    サーバーからクライアントにJSONなどのデータを送る際, そのデータを一旦文字列に変換する必要があります. これはその変換をするコード.
    また,第二引数のなんやかんやは省略しても送信できますが, 日本語のデータを送る際はこれを書かないとunicodeか何か謎の形式になってしまうので,今回はごちゃごちゃ書いてます.
    この引数を書かない場合と書いた場合は以下の通り.

次に

PHPからMySQLを操作したい.