Webサービスデータのインポート:JMP ® 14の新しいHTTPリクエスト(US 2018 231)
レベル: 中級
ブライアン・ブーン、SAS JMP 主席ソフトウェア開発者
政府機関や民間企業は、RESTfulサービスを通じてインターネット経由でデータを公開するケースが増えています。JMP 14には、JSL経由で利用できるHTTPリクエストという新機能が搭載され、これらのRESTfulサービスにアクセスできます。本稿では、RESTfulサービスとは何かを説明し、 HTTPリクエストを使用してJMPに新しいデータを取り込む方法をいくつか紹介します。
RESTとは何か
REST(Representational State Transfer)は、インターネット上のコンピュータシステム間の相互運用性を実現する方法です。RESTfulサービスは、このパラダイムを活用したWebベースのサービスです。RESTful APIは、HTTPリクエストを使用してデータのGET 、 POST 、 PUT 、 DELETEを行い、RESTfulサービスとやり取りするアプリケーション・プログラム・インターフェース(API)です。
HTTPプロトコルは、クライアントがサーバーにリソースに対して実行してほしいアクションを示すための、一連のリクエストHTTPメソッドを定義します。これらは次のとおりです。
|
得る
|
リソースをリクエストする
|
|
頭
|
リソースメタデータのみを要求する
|
|
役職
|
リソースを受け入れるリクエスト
|
|
置く
|
リソースを保存または作成するためのリクエスト
|
|
消去
|
リソースの削除リクエスト
|
|
パッチ
|
リソースの状態を変更するリクエスト
|
新しい用語、馴染みのある活動
これはまったく新しい概念のように思えるかもしれませんが、最も一般的な 2 つのリクエスト方法である「得る」と「役職」についてはすでに精通しています。
得る
得る
has two personalities.
最初のパーソナリティは、単にリソースを取得することです。つまり、Webリソースにアクセスするという意図のみを持ちます。これは図1に示されています。ここでは、ブラウザがWebページにアクセスしています。 
Figure 1. “
得る
for a web resource”
2つ目は、クエリ文字列と呼ばれるものを使ってリソースにアクセスすることです。クエリ文字列は、Webリソースによって定義されるキーと値のペアのセットであり、クライアントはこれらのパラメータを使ってサーバーにリクエストのフィルタリングや変更を要求します。これは図2に示されています。ここでは、ブラウザはサーバーにリクエストの変更を要求しています。
役職
一方、役職はより複雑です。役職はサーバーにリソースの変更または作成を要求します。役職には通常、文字データのキー/値ペアやファイルのキー/値ペアのコレクションを含むHTMLフォームが含まれます。図3は、ユーザーをAmazonにサインインさせる例です。ここでのキー/値ペアは次のとおりです。
|
メール
|
メールアドレスのサインイン
|
|
パスワード
|
パスワード
|
Figure 3. “
役職
form data to a web resource”
なぜ使うのか
HTTPプロトコルにより、情報スーパーハイウェイは「高速道路は舗装され、道路標識は設置され、橋は架けられた」というイメージを思い起こさせます。この標準規格により、新たなデータ管理企業の設立が可能になりました。さらに、HTTP標準の採用により、既存企業によく見られる情報サイロ化が解消されました。こうした企業には、以下のような企業が挙げられます。
|
Text-Processing.com(感情データ)
|
ジェンキンス
|
|
がある
|
ハブ
|
|
オフィス365
|
グーグル
|
|
ドロップボックス
|
ワンドライブ
|
|
AWS(アマゾン ウェブ サービス)
|
米国国勢調査局
|
|
で
|
パブケム
|
|
ニューヨーク・タイムズ
|
フィットビット
|
|
ヤフー
|
ビットコイン
|
|
マーベルコミック
|
SAS
|
|
オープンAQ
|
ジャンプ
|
使い方
JSON
JSON(JavaScript Object Notation)は軽量なデータ交換フォーマットです。JavaScriptプログラミング言語のサブセットに基づいています。JSONは言語に依存しないテキストフォーマットですが、多くのプログラマーにとって既に馴染みのある概念を採用しています。
JSON は次の 2 つの構造に基づいて構築されます。
- 名前と値のペアのコレクション。(辞書、ハッシュテーブル、連想配列など)
- 順序付けられた値のリスト。(配列、ベクトル、リストなど)
新しい用語、馴染みのある活動(再び)
日本語
JMPを使用する場合、JSLは最適なスクリプト言語です。JSONは新しい用語かもしれませんが、JSLはJSONに必要な2つのデータ構造をサポートしています。
リスト
リストは次のような項目を保存するコンテナーです。
- 数字
- 変数
- 文字列
- 式(代入や関数呼び出しなど)
- 行列
- ネストされたリスト
連想配列
- 連想配列は、一意のキーを一意でない可能性のある値にマッピングします。連想配列は、辞書、マップ、ハッシュマップ、ハッシュテーブルとも呼ばれます。
JSL には、JSON 処理に固有の 2 つの関数も含まれています。
JSONを解析する
- JSON データの構造に基づいて、JSON テキストを連想配列またはリストに変換します。
JSON式として
これらの関数により、スクリプト作成者は JSL コンテナーと JSON 間でシームレスに変換できます。
HTTPリクエスト
HTTPリクエストはJMP 14の新機能です。元々、この技術はJMPとJMP Public間のやり取りを処理するために開発されました。しかし、JMP Publicへのデータ公開以外にも応用できることがすぐに認識され、JSLではHTTPリクエストとして公開されました。
HTTPリクエスト入門
HTTPR はhttp と https プロトコルの両方をシームレスにサポートし、cURL に期待される動作の多くをカプセル化します。
「cURLはコマンドラインやスクリプトでデータ転送に使用されます。また、自動車、テレビ、ルーター、プリンター、オーディオ機器、携帯電話、タブレット、セットトップボックス、メディアプレーヤーにも使用されており、毎日数十億の人々に影響を与える数千ものソフトウェアアプリケーションのインターネット転送バックボーンとなっています。」
さらに重要なのは、 HTTPリクエストはWebリソースとJSLを結びつける接着剤のようなものだということです。つまり、 HTTPリクエストはWebリソースと通信し、スクリプト作成者がJSLでレスポンスを処理できるようにします。JSLの複雑さは作成者によって制御されます。
Web リソースとやり取りする際に使用する最も一般的な HTTP メソッドは次のとおりです。
GETアクションでHTTPリクエストを使用する
A
得る
action is probably the most common
HTTPリクエスト
action. This action is a read-only action that can bring data into JMP.
Common messages for
HTTPリクエスト
:
Figure 4. “
HTTPリクエスト
得る
”
HTTPリクエストアクションには、Webリソースにパラメータを送信するための「クエリ文字列」が伴うことがよくあります。図5は、 「クエリ文字列」を含むHTTPリクエストを使用しています。JSLでは、 「クエリ文字列」はキーを文字値または文字値のリストにマッピングする連想配列です。図5のスクリプトを実行すると、URLは自動的に次のように展開されます。
http://quotes.rest/qod.json?category=inspire
Figure 5. “
HTTPリクエスト
得る
using a ‘
クエリ文字列'
”
POSTアクションでHTTPリクエストを使用する
HTTPリクエスト
役職
actions are often more complex.
Common messages for
HTTPリクエスト
:
-
"方法"
-
「URL」
-
"形状"
-
「JSON」
-
"ファイル"
-
「ブロブ」
-
"送信"
図6はHTTPリクエストの「フォーム」データを示しています。JSLでは、 「フォーム」データは「フィールド」と「ファイル」という2つの属性を持つことができます。これらはどちらもJSL連想配列であり、キーを文字値または文字値のリストにマッピングします。 「ファイル」の場合、文字値または文字値のリストは「フォーム」に追加するファイル名です。
Figure 6. “
HTTPリクエスト
役職
using a
形状
”
Figure 7 shows an
HTTPリクエスト
“
JSON」
data. In JSL,
「JSON」
can be either an
連想配列
or character data in JSON format.
JSON式として
will create a well-defined JSON object to use with
HTTPリクエスト
. JSON data is sent as the body of the request.
Figure 7. “
HTTPリクエスト
役職
using ‘
JSON'
”
図8はHTTPリクエストの「 File」データを示しています。JSLでは、 「File」はリクエスト本体として送信するファイル名です。 
Figure 8. “
HTTPリクエスト
役職
using ‘
ファイル'
”
HTTPリクエスト「 Blob」データに対する最後のアクションです。JSLでは、 「Blob」はリクエスト本体として送信するバイナリBlobデータです。つまり、リクエストの一部として送信する前にファイルをディスクに書き込む必要はありません。
その
得る
アクションは、最も簡単なリクエストです
役職
最も複雑なのは、
HTTPリクエスト
ウェブリソースは常にサーバーによって定義されます。HTTPプロトコルは明確に定義された標準ですが、データ(およびデータ構造)はウェブリソースごとに定義されます。つまり、One DriveのAPIはDropboxとは異なりますが、機能は似ています。
差出人への返送
HTTPリクエストの“ Send”メッセージから得られるデータは、Webリソースに応じて、文字データ、バイナリBLOBデータ、または空データのいずれかになります。返されたデータの“ Is Empty”チェックは、データ調査の最も粗いレベルです(noneを除く)。ただし、よりきめ細かいレベルの調査が必要な場合は、“ Is String”を使用して文字データかどうかを確認できます。
さらに詳細な調査を行うには、 「MIMEタイプの取得」をご利用ください。一般的なMIMEタイプについては、本論文の参考文献セクションにある「MIMEタイプの不完全なリスト」をご覧ください。
最後に、必要に応じて、次のメッセージを使用して、Web リソースからの低レベルの HTTP ステータス コードを調査できます。
|
「情報あり」
|
100-199
|
|
「成功している」
|
200-299
|
|
「リダイレクトあり」
|
300-399
|
|
「クライアントエラーが発生しました」
|
400-499
|
|
「サーバーエラーが発生しました」
|
500-599
|
|
「エラーあり」
|
クライアントまたはサーバーのエラーが発生しています
|
|
「ステータスを取得」
|
HTTPステータスコード
|
HTTP ステータス コードの説明については、このホワイト ペーパーの「リファレンス」セクションの「ステータス コードの定義」の記事を参照してください。
どこで使うのか
HTTPS は任意の Web リソースからの文字データまたはバイナリ BLOB データに対応していますが、ここでは RESTful サービスからの文字データ、つまり JSON データに焦点を当てます。
これは甘い
RESTを使用するHTTPプロトコル標準に基づいて設立された新しいデータ管理企業の一つがPubChemです。PubChemは、国立衛生研究所(NIH)のオープン化学データソースとして2004年に設立されました。大学、製薬会社、政府機関、化学薬品ベンダーなどの機関から提供される数百のデータソースが、毎月PubChemのレコードを更新するために利用されています。これは、公開されている化学情報源としては最大規模のコレクションです。
PubChem はデータクエリを物質、化合物、アッセイなどに分類します。そこから、さまざまなプロパティ、説明、投与量、その他の興味深い特性を取得できます。
私はそれをM&Mの材料として読みました。 
図9. 「プレーンM&Mの材料」
プレーンM&M'sの原材料名をJMPデータテーブルに作成するJSLスクリプトを作成し、その内容を確認しました。原材料名に人工着色料が大量に含まれていたのは当然のことでした。
JMP の部分データ テーブル表現は次のようになります。 
図10.「プレーンM&Mの成分データ表(一部)」
JSL スクリプトが実行されると、 HTTPSを使用して、物質または化合物の画像や、PubChem の RESTful サービスによって提供されるその他のプロパティが取得されます。 
図11. 「PubChemデータによるプレーンM&M成分データ表の一部」
対象となる RESTful サービスの URL は次のとおりです。
( [NAME]は図9および図10に記載されている物質または化合物の名前です。)
ラクトースのような化合物のイメージデータを取得するには、 HTTPリクエストは次のようになります。 
Figure 12. “
得る
-ing the image of Lactose from PubChem”
Figure 13. “
得る
-ing and displaying the image of Lactose from PubChem”
Lactose リクエストは、PubChem の compound エンドポイントを使用します。ここでは、さらに 2 つの概念が使用されています。1 つ目はEncode URIです。URI エンコーディング(パーセントエンコーディングとも呼ばれます)は、RESTful URL が ASCII 文字のみで構成されることを保証します(幸いなことに、Lactose は ASCII 文字のみで構成されています)。2 つ目の概念は「 MIME タイプ データ」です。この PubChem エンドポイントから返されるのは、バイナリ blob データ(PNG 画像)です。 「MIME タイプ データ」チェックは、New Image で使用される前に、blob が実際に PNG であることを確認します。PNG が見つからない場合、このエンドポイントは文字データを返します。
To retrieve the full record of Lactose in JSON data, the
HTTPリクエスト
looks like:
Figure 14. “
得る
-ing the full record of Lactose from PubChem”
PubChem によって定義されたエンドポイントは、 /JSONサフィックスが RESTful サービスが JSON データを返すことを示すことを指定しているため、 「データ」の MIME タイプを確認する必要はありません。ただし、JSON を処理する必要があります。返された「データ」を処理するには、[少なくとも] 2 つの方法があります。1 つ目は、「JSON To Data Table」を使用することです。これは、 「データ」から JMP データ テーブルを作成しようとします。長方形または表形式のデータの場合、これは適切に (高速に) 機能します。ただし、すべての RESTful サービスは表形式のデータを返すわけではありません (PubChem はそうではありません)。返されたデータを処理する 2 番目の方法は、「JSON の解析」です。これは JSL連想配列を作成します。つまり、JSON を解析する必要はありません。ただし、返されたデータがどのように構造化されているかを知っておく必要があります。つまり、キーと値のペアであるか、キーと値のペアであるかを知っておく必要があります。これは、JMP ログで生の JSON をキャプチャし、任意の JSON エディターを使用してその構造を調べることができるため、見た目ほど難しくはありません。
Lactose の JSON データの部分的な表示は次のようになります。 
図15. 「PubChemからのラクトースJSONデータの一部」
This editor displays a side-by-side representation of raw JSON with corresponding JSON object. When you examine the data, a {..} in JSON, think JSL
連想配列
. Likewise, when you encounter a [..] think JSL
リスト
.
この手法を使用すると、図 14 に示す完全なレコード スクリプトを変更し、それを使用してラクトースのプロパティの JMP データ テーブルを作成できます。 
図16. 「PubChemからLactoseの全レコードを取得し、「 props」をデータテーブルにする」
This example uses
JSONを解析する
to translate the raw JSON from PubChem to a JSL
連想配列
. After investigating the JSON data structure, we realize that we are only interesting the “props” data in the Lactose JSON. We then can use the familiar JSL
連想配列
navigation to retrieve the JSL
リスト
found at “PC_Compounds”. We want only the first item in the list (since most of the “
小道具
are repeated)
「小道具」
data is a JSL
連想配列
so we can use
JSON式として
to translate
「小道具」
back to JSON and use it in
JSONからデータテーブルへ
. The result is in Figure 17.
図17.「部分乳糖特性データ表」
覚えておいてください、 HTTPリクエストはWebリソースをJSLに結びつける接着剤に過ぎません。データをJSLに取り込めば、ニーズに合わせてシンプルにも複雑にも使えます。
驚嘆すべきもの
2014年、マーベル・コミックは70年分のコミック情報にアクセスできるRESTfulサービスを作成しました。マーベル・コミックAPIの限界はスクリプト作成者の想像力のみなので、当然ながらキーを登録してアクセスし、何が見つかるかを確認する必要がありました。そこで、マーベル・ユニバースを巡回する様々な列を扱うmarvel:API JSL関数を作成しました。
私はデッドプールのファンなので、最初のクエリで次のデータ テーブルを作成しました。 
図18. 「デッドプールのデータテーブルの一部」
これにより、マーベル・コミック・ユニバースに登場する4人のデッドプールのキャラクターが明らかになりました。最初のキャラクターの正体に興味があったので、自分で作成したシリーズのクリックイベントハンドラーを選択しました。クリックの発生源に基づいて、驚異:API関数はマーベルへの新しいクエリを生成し、その戻り値からデッドプールがMCUのどこでクロスオーバーしているかを示します。結果は50行に制限しましたが、興味深い結果がいくつか見つかりました。デッドプールの人気が上昇し、下降した(そして再び上昇した)時期を確認するために、「 title」と「startYear」の簡単な分布分析を行いました。
図19. 「デッドプールの部分分布」
図 19 は、2007 年にデッドプールが次のようなさまざまなマーベル コミック タイトルにクロスオーバーしたことを示しています。
- アベンジャーズ:ザ・イニシアティブ(2007-2010)
- ケーブル&デッドプール
- シビル・ウォー: X-メン・ユニバース。
デッドプールへの関心は2007年以降再び衰えましたが、ライアン・レイノルズが『ウルヴァリン: X-MEN ZERO』(2009年)で初めてこのキャラクターを演じたことで再び高まり(分析によると)、キャラクターへの関心が再燃し、2011年にピークに達しました。
2012年から2015年にかけて、マーベルのリブート作品『デッドプール キルズ ザ マーベル ユニバース』でマーベル コミック ユニバースが爆発しました。
最後に、2016年から2018年については驚きはありません。映画が公開された時期です。
デッドプール 2 のピーターは、マーベル コミック API を次のように最もよく要約しています。「広告を見て、面白そうだと思いました。」
使用される規則
RESTfulサービスという用語は、WebリソースがRESTベースである場合に使用されます。
Web リソースという用語は、一般的な Web アクセスが暗示される場合に使用される一般的な用語です。
HTTPアクションは太字で表示されます
ボタン/ダイアログコントロールは「引用符で囲まれ太字で表示されます」
ハイパーリンクは下線付きです
JSLオブジェクトと関数はイタリック体で表記されます
JSL変数/列/メッセージ名は「引用符で囲み、斜体で表記」
参考文献
Hawk, Sandro (2011年12月16日) REST https://www.w3.org/2001/sw/wiki/RESTから取得
W3.orgメソッド定義はhttps://www.w3.org/Protocols/rfc2616/rfc2616-sec9.htmlから取得しました。
W3.org
ステータスコードの定義
retrieved
https://www.w3.org/プロトコル/rfc2616/rfc2616-sec10.html
Mozilla.org (2018年5月13日) HTTPリクエストメソッドはhttps://developer.mozilla.org/en-US/docs/Web/HTTP/Methodsから取得
JSON.org (2017年12月) JSONの紹介https://www.json.orgから取得
JMP.com (2018, July 12)
リスト
retrieved from
https://www.jmp.com/support/help/14/lists.shtml
JMP.com (2018年7月12日)連想配列の操作https://www.jmp.com/support/help/14/work-with-associative-arrays.shtmlより取得
https://curl.haxx.se/から取得したURL を使用してデータを転送するための CURL コマンドライン ツールとライブラリ
W3.org (2015年1月22日) Webのセキュリティ確保https://www.w3.org/2001/tag/doc/web-httpsより取得
W3.org (2014年6月11日) HTTP - ハイパーテキスト転送プロトコルhttps://www.w3.org/Protocols/より取得
Mozilla.org (2018, July 3)
MIMEタイプの不完全なリスト
retrieved from
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types
PubChem.ncbi.nlm.nih.gov PubChem に関する情報はhttps://pubchemdocs.ncbi.nlm.nih.gov/から取得しました
MMs.com原材料はhttp://www.mms.com/us/nutritionから取得しました
W3Schools.com HTML URL エンコーディングリファレンスはhttps://www.w3schools.com/tags/ref_urlencode.aspから取得しました。
Developer.marvel.com開発者ポータルはhttps://developer.marvel.com/から取得しました