- 投稿日:2019-04-03T21:36:56+09:00
phpのclassとinstanceと$this
最近業務の独自のフレームワークを使った案件で
$this
というのが良く出てくるので、調べたことをメモしてみます。
$this
はインスタンス自身を指す。と簡単に言われても良くわからないので
整理して説明するとclass (クラス)
クラスとは複数の処理をまとめた設計図みたいなもの。
あくまで設計図、これがそのまま色々動いて処理を返すわけではない。instance (インスタンス)
インスタンスとはクラスという設計図を元に作成したロボットのようなもの。
これが色々動いて処理を返してくれる。そんでどうやってクラスを作ってインスタンスを作るのかというと
<?php class kurasu{ public function hyouzi(){ echo 'ひょうじ'; } } $insutansu=new kurasu; $insutansu->hyouzi(); ?>こんな感じに書く。
kurasu
という設計図にはhyouzi()
という機能が設計されている。
その設計図を元に作られた$insutansu
ロボットは$insutansu->hyouzi();
と命令を出すことで動いてくれる。
というイメージ。$this
そして結局
$this
がどういうことなのかというと
設計図を元に作られたロボット自身の事を指す。
この指すというのは、設計図に書かれているが設計図の事を指しているわけではない。では
$this
の使い所を説明していく。<?php class kurasu{ public $hensu='TEST'; public function hyouzi(){ echo $this->hensu; } } $insutansu=new kurasu; $insutansu->hyouzi(); ?>こんな感じで書いていく
今度は設計図には$hensu
という情報と、その情報を表示する機能であるhyouzi()
が設計されている。
その設計図を元にしたロボットである$insutansu
は、当然設計図どおりに$hensu
を覚えているので
$insutansu->hyouzi();
と命令を出すとTEST
と表示する。まぁこれだけではわかりにくいので
<?php class kurasu{ public $hensu='TEST'; public function hyouzi(){ echo $this->hensu; } } $insutansu_a=new kurasu; $insutansu_z=new kurasu; $insutansu_a->hensu='テスト'; $insutansu_a->hyouzi(); $insutansu_z->hensu='てすと'; $insutansu_z->hyouzi(); ?>今度はこう書いてみた。
kurasu
という設計図で、2つのロボット$insutansu_a
と$insutansu_z
を作った。それぞれに
$insutansu_a
には$insutansu_a->hensu='テスト';
$insutansu_z
には$insutansu_z->hensu='てすと';
と$hensu
の情報を変更してみた。そして最後に2つのロボットは同じ機能である
hyouzi()
を実行する。結果はどうなるか想像出来るだろうか?
2つのロボットは同じ機能を実行したにも関わらず
$insutansu_a
はテスト
と表示し
$insutansu_z
はてすと
と表示する
異なる結果になる。これは
hyouzi()
の中の$this
によるもので
$insutansu_a
の$this
は$insutansu_a
自身、
$insutansu_z
の$this
は$insutansu_z
自身
を指している。
hyouzi()
の中の$this
は設計図を指してはいない。なので2つのロボットはそれぞれ自身が覚えている
$hensu
を表示したのだ。編集後記
入社三日目
なんだか褒められて伸ばされている気がするが
それに比例してプレッシャーが凄い。
でも飛躍的な成長は大きな痛みを伴いやすいので
日々昨日の自分を超えるしか無いのかな、って思う。そんな感じの事をイチローが言ってたな笑
- 投稿日:2019-04-03T20:38:09+09:00
php-master-changes 2019-04-02
今日は JIT 実装の最適化や修正が色々あった!
正直そこまでよく分かってないので、そのうち時間とって頑張って見ないとあかん気がする2019-04-02
dstogov: Use Zend MM for JIT temporary buffres allocation
- https://github.com/php/php-src/commit/6fccca54a20c34c972f0c98db17462a63189715e
- ext/opcache で、JIT 用のバッファ確保に Zend Memory Manager を使うよう修正
- 何も定義してないとすぐ下で include してる dasm_proto.h の実装にフォールバックしてた奴かな
dstogov: Eliminate hash lookup for immutable op_arrays
- https://github.com/php/php-src/commit/d196ec9b93805df1bc3e1446e834e42eada0eb8a
- ext/opcache で、JIT でのユーザ定義関数呼び出し時に ZEND_ACC_IMMUTABLE なものについては op_array のハッシュテーブル参照を無くして高速化
dstogov: Removed checks for required object handlers
- https://github.com/php/php-src/commit/8bf2de045b5f3f5e3aa81042e09bc22addf1c517
- ext/opcache で、JIT でのオブジェクトアクセス時に(必須の)オブジェクトハンドラの存在チェックを削除して高速化
dstogov: Fixed edge cases in ZEND_ASSIGN_OP+ASSIGN_DIM and replaced specialized helpers with single one
- https://github.com/php/php-src/commit/4e1d545d470cd56878ac47cd6eac26675582831b
- ext/opcache で、JIT 時のオブジェクト/配列の代入処理でなんかエッジケースがあったらしいがよく分からず
- 状況特化のヘルパをがっつり潰して共通関数で済ますようにしているようだ
dstogov: typo
- https://github.com/php/php-src/commit/b6dc1d2466e14171ebcd0a5f02b9d5e25a2e0b4b
- ext/opcache で、JIT 処理内の typo を修正
cmb69: Fix misplacement of calling convention declaration
- https://github.com/php/php-src/commit/ba67d44e0771ea0e93115c4a4105880213850f00
- ext/opcache で、JIT 用実装の関数宣言で ZEND_FASTCALL の指定位置が誤っていた問題の修正
dstogov: Added comments
- https://github.com/php/php-src/commit/0d6fce887b19e1b78778bf41421f18f5ffcdeb7f
- ext/opcache で、JIT 用実装にコメントの追加
- あとなんか
#if 0
で HYBRID VM のハンドラ呼び出しを末尾呼び出しで直接飛ぶ形に処理したい気持ちが表明されている
- 投稿日:2019-04-03T18:47:36+09:00
Laravel ユーザー情報取得メソッド
use ~/Auth; 追加
$hoge = Auth::user();
- 投稿日:2019-04-03T18:25:12+09:00
Selenium webdriverメソッド~PHP~
SeleniumをPHPで書くときのメソッドのまとめがほしいなと思ったので
よく使うであろう基本的なメソッドをまとめました。メソッド一覧
指定したURLへ遷移
$driver->get("URL");ウィンドウを閉じる
$driver->close();全てのウィンドウを閉じる
$driver->quit();一つもどる
$driver->navigate()->back();一つ進む
$driver->navigate()->forward();ブラウザを更新する
$driver->navigate()->refresh();URLを取得する
$driver->getCurrentURL();タイトル取得
$driver->getTitle();スクリーンショット取得
$driver->takeScreenshot("場所とファイル名");要素取得
$driver->findElemenet(WebDriverBy::id("ID")); $driver->findElemenet(WebDriverBy::name("NAME")); $driver->findElemenet(WebDriverBy::tagName("TAGNAME")); $driver->findElemenet(WebDriverBy::cssSelector("CSSSELECTOR")); // 複数取得 $driver->findElements(WebDriverBy::className("CLASSNAME");要素をクリック
$driver->findElement(WebDriverBy::id("ID"))->click();要素のテキストを取得
$driver->findElement(WebDriverBy::id("ID"))->getText();テキスト入力
$driver->findElement(WebDriverBy::id("ID"))->sendKeys("入れたいテキスト");入力された値をクリア
$driver->findElement(WebDriverBy::id("ID"))->clear();属性の取得
$driver->findElement(WebDriverBy::id("ID"))->getAttribute("属性");要素が表示されるまで待つ
$driver->wait(10)->until( WebDriverExpectedCondition::visibilityOfElementLocated(WebDriverBy::id("ID")) );また更新します。
- 投稿日:2019-04-03T17:54:08+09:00
Imagickで斜体文字を合成する備忘録
ItalicではなくObliqueらしい。
https://cottala-becco.com/italic_and_oblique/sample.php<?php declare(strict_types = 1); /* 文字 */ $text = "あああああ\nいいいいい"; $x = 0; $y = 100; $o_text = new ImagickDraw(); $o_text->setFillColor( new ImagickPixel('#0000ff') ); $o_text->setTextUnderColor( new ImagickPixel("rgba(204, 204, 204, 0.5)") ); //背景色(デバッグ用) $o_text->setTextAntialias(false); //アンチエイリアス解除 $o_text->setFontSize(35); $o_text->setFont('フォントファイルのパス'); $o_text->skewX(-15); //水平方向に傾ける $o_text->setGravity( imagick::GRAVITY_NORTH ); //一旦中央寄せ $o_text->annotation($x, $y, $text); //その後、位置を微調整 /* 背景画像合成 */ $o_base = new Imagick('base.png'); $o_base->drawImage($o_text); $o_base->setImageFormat('png'); $o_base->setImageCompressionQuality(0); // https://stackoverflow.com/questions/9710118/convert-multipage-pdf-to-png-and-back-linux/12046542#12046542 //ファイル保存 if (!true) { $o_base->writeImage('hoge.png'); } //直接表示 else { header("Content-Type: image/png"); echo $o_base; } /* メモリ解放 */ $o_base->destroy(); $o_text->destroy();できあがり
- 投稿日:2019-04-03T17:36:17+09:00
LaravelとSchemaSpyで簡単ER図作成
ER図を描こう
あるwebサービスの運用を他のチームに引き継ぐことになりまして、
ふとデータベースまわりのドキュメントがないことに気づきました。とまあ、そんな状況でなくともER図を描くのは面倒です。
構築したテーブルから生成
統合環境等で作成もできますが、外部キーを張っていないと自動生成できません。
運用していたwebサービスは外部キーは張っていなくてアプリケーションでリレーションをしていたので、テーブルとカラムのリストまでしか読み込めません。かといって専用のツールで描くと、MacとWindowsで共有できないことがありますし
Excelで作成するのはちょっと。。SchemaSpy
SchemaSpyというツールを使いました。
これだと、DBから読み取れるところは読み取って、
追加でリレーションやカラムコメントを記述することができます。
[https://schemaspy.readthedocs.io/en/latest/configuration/schemaMeta.html]また、設定ファイルや生成したファイルなどをリポジトリ管理することもできますし、
表示もブラウザなので、MacでもWindowsでも共有できます。ER図を出力してみる
GitHubリポジトリ
[https://github.com/mya-zaki/laravel-schemaspy-sample]環境
- PHP7.1
- Laravel5.5
- SQL Server 2017
構築
リポジトリをCloneする
DBのパスワードを編集
docker-compose.yml
schemaspy/schemaspy.properties
のを任意のパスワードに編集コンテナをビルド
$ docker-compose up -d --buildDB作成
$ docker-compose exec sqlsrv /opt/mssql-tools/bin/sqlcmd -H localhost -U SA -Q "create database laraveldb"パッケージをインストールする
$ docker-compose exec web composer install
.env
をコピーして、編集$ cp .env.example .env $ docker-compose exec web php artisan key:generate
- DB_CONNECTION=sqlsrv
- DB_HOST=sqlsrv
- DB_PORT=1433
- DB_DATABASE=laraveldb
- DB_USERNAME=SA
- DB_PASSWORD=(DBのパスワード)
DBテーブル作成
$ docker-compose exec web php artisan migrateSchemaSpyでデータベースドキュメント生成
準備ができたらSchemaSpyを実行します。
SQL Serverなのでドライバをschemaspy/drivers/mssql-jdbc-7.2.1.jre8.jar
に置いてあります。
ドライバーはこちらからXMLで情報追加
DBから読み取れない追加の情報について
schemaspy/schema-meta.xml
をおきます。<?xml version="1.0" encoding="utf-8"?> <schemaMeta xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schemaspy.org/xsd/6/schemameta.xsd"> <tables> <table name="users" comments="ユーザ情報"> <column name="name" comments="ユーザ名"/> </table> <table name="posts"> <column name="user_id"> <foreignKey table="users" column="id"/> </column> </table> </tables> </schemaMeta>XMLにはusersテーブルとnameカラムにコメントを、postsテーブルに外部キーの設定が記載されています。
実行
DBの接続先、ドライバー、追加のXMLのパス、出力先は
schemaspy/schemaspy.properties
に。
ここでschemaspyコンテナを実行します。$ docker-compose run --rm schemaspy実行後、
schemaspy/output/users.html
をブラウザで開きます。
usersテーブルとnameカラムにXMLに記述したコメントが表示されています。Relationshipsページへいくと、
usersとpostsがXMLに記載のとおりuser_idでつながっています。これで、DBになくてもコメントやリレーションを表示できました!
XMLのリレーションの記述を自動で生成
SchemaSpy、かなり便利だと思うのですがテーブルが増えてくると
リレーションを記述したXMLを書くのが少々面倒です。そこで、LaravelのEloquentのModelを継承したクラスのリレーションの実装からXMLを生成できるようパッケージを作りました。
mya-zaki/laravel-schemaspy-meta以下の4つのメソッドが実装されている時にXMLに反映するようにしました。
hasOne
hasMany
belongsTo
belongsToMany
実行
$ docker-compose exec web php artisan schemaspy-meta:generate App\\Models --excludeClass=Flight --xmlFile=schemaspy/schema-meta.xmlXMLが更新されます。
<?xml version="1.0" encoding="utf-8"?> <schemaMeta xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schemaspy.org/xsd/6/schemameta.xsd"> <tables> <table name="users" comments="ユーザ情報"> <column name="name" comments="ユーザ名"/> </table> <table name="posts"> <column name="user_id"> <foreignKey table="users" column="id"/> </column> </table> <table name="comments"> <column name="post_id"> <foreignKey table="posts" column="id"/> </column> <column name="foreign_key"> <foreignKey table="posts" column="other_key"/> </column> </table> <table name="password_resets"> <column name="email"> <foreignKey table="users" column="email"/> </column> </table> <table name="permission_role"> <column name="r_id"> <foreignKey table="roles" column="id"/> </column> <column name="p_id"> <foreignKey table="permissions" column="id"/> </column> </table> <table name="my_phones"> <column name="user_id"> <foreignKey table="users" column="id"/> </column> </table> <table name="role_user"> <column name="user_id"> <foreignKey table="users" column="id"/> </column> <column name="role_id"> <foreignKey table="roles" column="id"/> </column> </table> </tables> </schemaMeta>usersとpostsの記述のあとに、各テーブルのリレーションの情報が追加されました。
指定したXMLに追加分を上書きになるので、リレーションの記述の削除はされません。もういちどschemaspyコンテナを実行します。
$ docker-compose run --rm schemaspyRelationshipのページ
schemaspy/output/relationships.html
を開くとおわり
SchemaSpyとXMLの生成で完全自動化とはいきませんが
だいぶER図の作成が簡単になったと思います。しっかり外部キーをはって構築していれば、
SSMSとかMySQL Workbenchとかが便利そうですが。
- 投稿日:2019-04-03T17:24:54+09:00
PHPの変数って難しい
新人のとき、ほぼ新人のみで作成したWebアプリケーションに対して要望が投げられたため対応していたところ、目を疑うものを見つけてしまった。
びっくりだよforeach ($postData as $key => $item) { $arr['email'] = $this->session->userdata('email'); //何行かの処理... $arr = array( 'name' => $item['name'], 'email' => $arr['email'], 'text' => $item['text'], ); //いろいろ処理... }いやこれ動くんかい。まじかい。自分が作ったとこじゃないから知らんかったぞ。
でも考えてみれば文末来るまでは変数宣言終わってませんもんね……そりゃまあうまくはいきますか……。
いやでも変数初期化しよ…?そもそも名前変えよ……?
社内でしか使われていないのでこっそり…こっそり修正します……。
こうみると新人の頃のコード本当にひどいなと……いっそ笑けるのでおっけいです(ダメ)。
- 投稿日:2019-04-03T17:10:29+09:00
PHPのSeleniumでタブの切り替えを行う方法
PHPのSeleniumで2つのタブの切り替えを行う方法です!
$url = "https://www.google.com/" $main = $driver->getWindowHandle(); $sub = null; $driver->executeScript("window.open(\". $url . "\", null, null)"); foreach ( $driver->getWindowHandles() as $handle ) { if ( $handle != $main ) { $sub = $handle; } } $driver->switchTo()->window($sub); /* やりたい処理 */ $driver->close(); $driver->switchTo()->window($main);解説
$driver->executeScript( ~~ );
で新しいタブを開くforeach ( ~~ )
では全ウィンドウハンドルを取得して、新しいタブのウィンドウハンドルを$sub
に格納$driver->switchTo()->window($sub);
で$sub
(新しいタブ)に切り替え$driver->close();
で新しいタブを閉じる$driver->switchTo()->window($main);
で元のタブに切り替える
- 投稿日:2019-04-03T16:17:10+09:00
サーバー起動しようとしたらもう使われてるって言われたら
サーバー起動できないときの対処
エラー
$ php -S 192.168.33.10:8000 Failed to listen on 192.168.33.10:8000 (reason: Address already in use)phpサーバー起動しようとしたらこんなエラーが。
サーバー起動するのに失敗。理由はもう使われてるアドレスだから。やってみたこと
$ lsof -i:8000解説
lsofコマンドはプロセスが開いているファイルを表示する。
これでは意味がよくわからなかったが、-i:8000とすることでポート番号8000のプロセスを調べることができるらしい。lsofコマンドが使えなかったのでインストールされているか調べる。
which -a lsofwhichは指定したコマンドのフルパスを表示する。
-aはオプションで、指定したコマンドが実行可能なパスをすべて表示する。インストールされていなかったのでインストール
sudo yum install lsof再度
$ lsof -i:8000しかし、これはなにも表示されなかったので失敗。
結果
二つ目の策としてpxコマンドを使おうとして、その前に一度サーバー起動に挑戦したら起動できた。
なぜだ。
- 投稿日:2019-04-03T12:50:27+09:00
Ubuntu16.04にPHPの環境構築
環境
Ubuntu 16.04まずは一応アップデートをしておきます。
apt-get updatesudoがなければインストールをします。
apt-get install -y sudoApache2をインストールします。(バージョン確認)
sudo apt-get install apache2 apache2 -vPHP7をインストールします。
sudo add-apt-repository ppa:ondrej/php /* もし、add-apt-repositoryがなければ sudo apt-get install software-properties-common sudo apt-get update */ sudo apt-get install php7.0 php7.0-mysql libapache2-mod-php7.0 php7.0-mcrypt php7.0-mbstring php7.0-xml php -vこれでPHPのインストールは完了ですが、Composerも入れておくと便利です。
Composerについては別の記事で。
- 投稿日:2019-04-03T12:28:12+09:00
【Laravel】バージョン確認コマンド
Laravekのバージョンを確認するコマンドの備忘録です。
php artisan --versionor
php artisan -V
- 投稿日:2019-04-03T10:56:10+09:00
Q. apacheのバーチャルホスト毎の設定でpost_max_size変えたい
A. apacheのconfか、.htaccessで出来る。
https://www.php.net/manual/ja/ini.list.php
post_max_size "8M" PHP_INI_PERDIR
https://www.atmarkit.co.jp/ait/articles/1112/21/news127.html
PHP_INI_PERDIRはディレクトリごとの設定変更が可能なディレクティブです。.htaccessによる変更もできます。php.iniファイルでの設定ももちろん可能です。しかし、PHPプログラムからの変更はできません。
--- apache設定の追加例
// PHP_Value PHP設定ディレクティブ1 設定値1
// PHP_Value PHP設定ディレクティブ2 設定値2PHP_Value post_max_size 512M
- 投稿日:2019-04-03T09:29:17+09:00
WebAPI
はじめに
限られた時間の中で今後WebAPIを使用していくための入門となるよう、「正確」よりも「わかりやすさ」を心がけてみました。
APIとは
Application Programming Interfaceの略。ソフトウェアからOSの機能を利用するための仕様またはインターフェースの総称で、アプリケーションの開発を容易にするためのソフトウェア資源のことをいう。「API」の重要な役割は、サービス提供者が公式に仕様を定義・管理している操作方法(インターフェース)を提供することである。
by 大塚商会 IT用語辞典
https://www.otsuka-shokai.co.jp/words/api.htmlAPIとは「Application Programming Interface(アプリケーション・プログラミング・インターフェイス)」の略語であり、「ある1つの機能に特化したプログラムで共有可能なもの」や「ソフトウェアの機能を共有する仕組み」のことです。よく使う機能がAPIとして用意されていれば、わざわざ一からプログラムを組む必要はありません。必要に応じてAPIを利用し、効率的に開発を進められます。
c++でのWINAPI使用例
test.cpp#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow){ HWND hwnd = CreateWindow(TEXT("TEST") , TEXT("これはテストウインドウです。") ,WS_CAPTION ,100 , 100 , 200 , 200 , NULL , NULL ,hInstance , NULL); if (hwnd == NULL) return 0; ShowWindow(hwnd , SW_SHOW); MessageBox(NULL , TEXT("これはテストです。"), TEXT("TEST1"),MB_OK); return 0; }
Windows OSの持つ機能が、「CreateWindow」を使用するだけで簡単に自社システム等で使用できます。
Windowは普段当たり前に使用しているでしょうが、移動やサイズ変更できたり、アクティブウインドウって概念があったり、実は複雑。自前で実装するのはとても大変。
それを解決してくれるのだよAPIは。
WebAPIとは
ネットワーク越しに、APIを提供することで、自システムはもとより、他社の作成した機能を自システムに取り込んだり、他社に自システムの機能を提供することが可能に!
従来は、APIといえばOSがアプリケーションソフト向けに提供していた機能を指していたが、現在はWebサービスがアプリ開発者向けに公開している機能を「Web API」と呼んでいるほか、気象情報、グルメ紹介、テレビ番組表、交通データ、観光情報などのさまざまなAPIがある。APIを利用すると、よく使う機能をAPIから呼び出すだけで使えるため、ゼロからプログラミングする必要がなくなり、ソフトウェアの開発を省力化できる。
公開されているWeb APIでは、「Facebook」「Twitter」「YouTube」「Googleマップ」などが有名で、スマートフォン向けのサービスやアプリ開発には欠かせない。
by 大塚商会 IT用語辞典
WebAPI特徴
- サーバで提供している(or されている)機能をhttpでネットワーク越しに使用する
- 決められたインターフェース、つまりパラメータやURL等で動作
- レスポンスは昔はXML、今はJSONが主流
- Webでajaxでよく利用される
- スマホアプリからの利用もあります
WebAPIの例
http://zipcloud.ibsnet.co.jp/doc/api
郵便番号検索API
郵便番号検索APIとは
郵便番号検索APIは、日本郵便が公開している郵便番号データを検索する機能をRESTで提供しています。
郵便番号検索API実行例 正常
http://zipcloud.ibsnet.co.jp/api/search?zipcode=731-3174
{ "message": null, "results": [ { "address1": "広島県", "address2": "広島市安佐南区", "address3": "大塚西町", "kana1": "ヒロシマケン", "kana2": "ヒロシマシアサミナミク", "kana3": "オオヅカニシマチ", "prefcode": "34", "zipcode": "7313174" } ], "status": 200 }
郵便番号検索API実行例 エラー
http://zipcloud.ibsnet.co.jp/api/search?zipcode=
{ "message": "必須パラメータが指定されていません。", "results": null, "status": 400 }http://zipcloud.ibsnet.co.jp/api/search?zipcode=9999
{ "message": "パラメータ「郵便番号」の桁数が不正です。", "results": null, "status": 400 }
HTTP Status Code
400 入力パラメータエラー by 郵便番号検索API
一般的にWebAPIではHTTP Status Codeを返却
200:成功
400:リクエストが不正
404:Not Found
500:サーバエラー
HTTP Status Code
100番台 情報
200番台 成功
300番台 リダイレクト
400番台 クライアント起因エラー(未入力等)
500番台 サーバ側エラー先輩に学ぶ HTTP Status Code
https://gist.github.com/rosylilly/3401612
HTTPメソッドについて
GET
リソースの取得
POST
リソースの新規登録
PUT
既存リソースの更新
DELETE
リソースの削除
RESTとは
REpresentational State Transferの略で、分散型システムにおける複数のソフトウェアを連携させるのに適した設計原則の集合、考え方のこと。Roy Fieldingが2000年に提唱した。
RESTの原則
主に以下の4つの原則から成る。
* アドレス可能性(Addressability)
提供する情報がURIを通して表現できること。全ての情報はURIで表現される一意なアドレスを持っていること。
* ステートレス性(Stateless)
HTTPをベースにしたステートレスなクライアント/サーバプロトコルであること。セッション等の状態管理はせず、やり取りされる情報はそれ自体で完結して解釈できること。
* 接続性(Connectability)
情報の内部に、別の情報や(その情報の別の)状態へのリンクを含めることができること。
* 統一インターフェース(Uniform Interface)
情報の操作(取得、作成、更新、削除)は全てHTTPメソッド(GET、POST、PUT、DELETE)を利用すること。
Swagger Editor
https://editor.swagger.io/
WebAPIの定義を作成可能なオンラインエディタsample.yaml 抜粋swagger: "2.0" info: version: "1.0.0" title: "Sample" basePath: "/v2" tags: - name: "user" description: "Operations about user" schemes: - "https" - "http" paths: /user: post: tags: - "user" summary: "作成 user" description: "This can only be done by the logged in user." operationId: "createUser" produces: - "application/json" parameters: - in: "body" name: "body" description: "Created user object" required: true schema: $ref: "#/definitions/User" responses: default: description: "successful operation"
自動生成Interface
UserApiInterface.php 抜粋/** * UserApiInterface Interface Doc Comment */ interface UserApiInterface{ public function createUser(User $body, &$responseCode, array &$responseHeaders); public function deleteUser($username, &$responseCode, array &$responseHeaders); public function getUserByName($username, &$responseCode, array &$responseHeaders); public function updateUser($username, User $body, &$responseCode, array &$responseHeaders); }
SwaggerとAmazon API Gateway
API GatewayからSwagger定義をインポート、エクスポート可能
Export as Swagger + API Gateway Extentions
swaggerの定義ファイル+API Gateway独自の認証等の各種設定AWS Amazon API Gateway
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/welcome.htmlAmazon API Gateway は、規模に関係なく、独自の REST および WebSocket API を作成、公開、保守、モニタリング、保護できる AWS のサービスです。AWS または他のウェブサービス、AWS クラウドに保存されているデータにアクセスする、堅牢かつ安全でスケーラブルな API を作成できます。独自のクライアントアプリケーション (アプリ) で使用するための API を作成できます。または、API をサードパーティーのアプリ開発者に対して使用可能にできます。
by AWS ドキュメント » Amazon API Gateway » 開発者ガイド » Amazon API Gateway とは
API Gatewayからのエクスポート
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-export-api.html
API Gateway コンソールを使用した REST API のエクスポート実習
参考文献など
Web API: The Good Parts 大型本 – 2014/11/21
水野 貴明 (著)
https://www.amazon.co.jp/Web-API-Parts-%E6%B0%B4%E9%87%8E-%E8%B2%B4%E6%98%8E/dp/4873116864