Tips

4D v16と4D v17でのREST通信の比較

日付2019/05/14
ID19-003
バージョンv17, v16
プラットフォームWin, Mac

4D v17では、オブジェクト記法が利用できるようになりましたので、JSONベースのREST通信がとても楽に行えるようになりました。

そこで、オブジェクト記法を用いた場合と、従来のコマンドで記述した場合とで、どのような違いとなるのかを実際に見れるように、具体的な例を挙げてコーディングしてみました。

比較サンプルのために利用させていただいたサービスは、株式会社ハートレイルズがインターネットで公開提供しているHeartRails Expressになります。HeartRails Express サービスで提供されているAPIの仕様は下記URLで公開されています。

このAPIのうち、指定した路線に存在する駅の一覧を得ることができる「駅情報取得 API」を利用してみました。

まずは、4D v16でのコーディング例です。

  //HTTP Getの利用方法はv16もv17も同じ
C_TEXT($url)
$url:="http://express.heartrails.com/api/json?method=getStations&line=JR山手線"
C_OBJECT($data)  //宣言を必ずする
$res:=HTTP Get($url;$data)  //オブジェクト変数で直接受け取る

  //オブジェクト配列に取り出す
ARRAY OBJECT($stasions;0)  //宣言を必ずする
OB GET ARRAY(OB Get($data;"response";Is object);"station";$stasions)

  //処理の例
C_LONGINT($i)
$i:=Num(Request("何番目の駅?";String(Size of array($stasions))))
Case of 
	: ($i=0)
	: ($i>Size of array($stasions))
	Else 
		ALERT(OB Get($stasions{$i};"line")+" "+OB Get($stasions{$i};"name")+"駅")
End case 

HTTP Getコマンドで変数に受け取る際に、オブジェクト変数に受け取っているところに注目してください。JSONデータを直接オブジェクト変数で受け取ることで、JSONデータをパースする手間が省けます。

サービスから返されるJSONは、駅情報のリストになりますが、リストはJSON配列として表現されているので、OB GET ARRAYコマンドを使い4Dの配列に変換しています。

次は、4D v17でのコーディング例です。

  //HTTP Getの利用方法はv16もv17も同じ
C_TEXT($url)
$url:="http://express.heartrails.com/api/json?method=getStations&line=JR山手線"
C_OBJECT($data)  //宣言を必ずする
$res:=HTTP Get($url;$data)  //オブジェクト変数で直接受け取る

  //処理の例
C_LONGINT($i)
$i:=Num(Request("何番目の駅?";String($data.response.station.length)))-1  //配列オブジェクトに直接アクセスするために1を引く
Case of 
	: ($i=-1)
	: ($i>=$data.response.station.length)
	Else 
		ALERT($data.response.station[$i].line+" "+$data.response.station[$i].name+"駅")
End case 

4D v17のコードで注目していただきたいのは、配列に取り出すことなく配列オブジェクトにアクセスしている点です。オブジェクト記法を用いることで、直接オブジェクトの内容にアクセスできるため、わざわざ配列変数を経由する必要がないのです。

このようにオブジェクト記法では、オブジェクトの構造に従って直接オブジェクトの内容を参照できる点に注目してください。