■Unity開発メモ用のWiki◎現在扱っていること・Unity全般・MMDからUnityへの変換してインポート・MMDの仕様把握・BlenderでMMDモデルのカスタム

目次


Web APIとは?

  • API(Application Programming Interface)とは、サービスのデータを外部のアプリケーションやプログラムから扱うための機能を提供するインターフェース
    • その中でも、HTTP通信によってやりとりを行うAPIをWeb APIという
  • Web APIは普通のWebサイトへのアクセスと同じように、HTTPプロトコルを利用し、リクエストとレスポンスによってやりとりを行う
  • よってHTTP通信が可能な環境であれば、ブラウザに限らずどのような環境からもWeb APIにアクセスが可能

APIを使う流れ

1、WebAPIを使うアプリケーションをWebAPIサイトに登録する(どのアプリケーションからの利用か判別するため)
2、APIキー、APIシークレットを取得して、アプリケーションに設定する(IDとパスワードのようなもの)
3、実際に操作してみる

  1. クライアントから
  2. httpで
  3. リクエストして
  4. サーバー処理して
  5. レスポンスが返ってくる

TIPS

HTTPリクエストの練習サイト(httpbin)
参考:APIクライアント開発時のモックに使えるhttpbinの紹介
  • httpbin は高機能なレスポンスをJSONで返してくれるサイト
  • トップページを見ると、返してくれるエンドポイントの一覧が見られる。
  • 自分が送ったパラメータやヘッダー情報をレスポンスしてくれるため、正しくリクエストされているかどうかを簡易的に確認するのに最適
コマンドラインでオプションが長くなった場合の改行
$ curl -s -X GET "url" \
    -H "accept: application/json" \
    -H "toke: *****" \
    -H "id: *****" | jq

WebAPIにアクセスする方法

Telnetコマンドを使う

  • おそらく「curlコマンド」を使ったほうがいい?
  • 「Telnet」は、ネットワークを介して2つのホスト間で通信を行うためのプロトコル
  • Telnetは、管理作業などを行うためにネットワーク経由でリモートのマシンへ「Telnetプロトコル」(→プロトコル規格書)でログオンする場合にしばしば用いられてきたツール
    • 現在では通信を暗号化できるSSHで代替されることが多い
$ telnet <接続先IPアドレス> <ポート番号>
  • Webサーバなら80番
  • なのでYahooAPIを使う場合は以下
telnet jlp.yahooapis.jp 80
POST(Telnetコマンド)
参考:【HTTP通信】telnetをつかってPOSTメソットをリクエストしてみた。
POST /URLのパス部分 HTTP/1.1
Host: www.必要ならURLのドメイン部分.com
Content-Length: パラメータの長さ(パラメータは何文字か)
送りたいパラメータを入力
  • 以下はYahooAPIの場合
POST /FuriganaService/V1/furigana HTTP/1.1
Host: jlp.yahooapis.jp
User-Agent: Yahoo AppID: <あなたのアプリケーションID>
Content-Type: application/x-www-form-urlencoded
Content-Length: 45

sentence=%E6%98%8E%E9%8F%A1%E6%AD%A2%E6%B0%B4
  • POST /FuriganaService/V1/furigana HTTP/1.1
    • POSTメソッドの後にパスを指定している
    • 最後にHTTPバージョンを指定
  • Host: jlp.yahooapis.jp
    • 宛先ホスト名またはIPアドレスを指定
  • User-Agent: Yahoo AppID: <あなたのアプリケーションID>
  • 送りたいパラメータが何かがわからないと数えられないので、まず先にパラメータの長さを決める。

curlコマンドを使う

参考;curlコマンドでapiを叩く
  • curlコマンドとはサーバから、もしくはサーバへデータ転送を行うコマンド
  • curlはlibcurlの機能を利用して、コマンドラインやスクリプトからデータの転送を行うためのコマンドラインツール
  • libcurlはHTTP/HTTPSをはじめとする多くのプロトコル、各種の認証方式をサポートし、ファイル転送の中断と再開などの機能を持つライブラリ
  • 書式
curl [options] [URL]
curlコマンドのPOSTオプション
  • APIに対してPOSTでリクエストを行う場合には-X POSTを指定する。
  • パラメータをつけてPOSTでリクエストを行う場合には、-dでパラメータを指定する。
curl -X POST [url] -d "name=hoge"
curl -X POST [url] -d "name=hoge&age=20"

ブラウザからのAjax通信でWeb APIを使う

  • HTMLファイルを作成し、同じディレクトリに空のapp.jsを作成する

自前のWebAPIを作る場合

参考:WebAPIについての説明
  • サーバーと処理ファイル用意すれば自前のWebAPIを作れる
  • ローカルで試す場合はMAMPとかXAMPを使う?

自前で作る時に事前に決める事

  • URLはどうする。通常データは名詞にする。
  • リクエストデータの構成。
    • keyとvalue
  • レスポンスデータの構成
    • JSONかXMLか
    • keyとvalue
  • エラー時のレスポンス
    • レスポンスデータ内で表現するか
    • httpステータスコードで表現するか

よくあるWebAPIのパターン

  • リクエストと一緒に渡されたデータを取得
  • リクエストデータの検証とか解析
    • リクエストの検証の部分は、有名なSQLインジェクション(DBを削除出来る攻撃)を防ぐ意味でも必要
  • レスポンスデータの値を作成
    • 通常はDBの操作(検索、追加、変更、削除)
  • レスポンスデータの作成
    • 場合によってはレスポンスデータの検証
    • 検索結果0件の場合とか
    • 変更が正しく行われなかったか.
  • JSON形式でレスポンスを返す

WebAPIの調査

  • URLは?
  • 何のデータをどうやって渡すか
    • keyは?
    • valueの形式や中身は
  • 何のデータがどんな形で返ってくるか
    • jsonの形式の場合
    • keyは
    • valueの形式や中身は
    • 一昔前はresultを付けて返す事が多かった。

phpファイルを直接調査する場合

  • URL
    • ファイルの設置場所とファイル名。
  • リクエストデータのkey
    • $_REQUEST,$_POST,$_GETの中に入ってる
    • $_REQUEST['user_type']の場合、keyはuser_type
  • リクエストデータのvalue
    • リクエストデータの検証している部分から推測
  • レスポンスデータのkey,value
    • JSON形式ならjson_encode()関数に渡してる値がレスポンスデータの中身。その前の処理を読んでkey,valueを確認
  • エラー時のレスポンス方法
    • header("HTTP/1.1 400 Bad Reques");とかあればhttpステータスコード使ってる
    • phpファイルでは無く、クライアント側のデベロッパーツールとかで確認
  • 但しフレームワークとか使ってる場合は、上記にあてはまらない事が多い

ファイル構成例

  • 以下をサーバーに置き実行する
users
 |-api
 |  |-users.php
 |-index.html
 |-api.js

サンプル・テスト

郵便番号検索API

参考:郵便番号検索API
例)以下をコピーしてブラウザのアドレス欄に貼り付けエンター
http://zipcloud.ibsnet.co.jp/api/search?zipcode=25...
  • search?以降のzipcode=2500011の部分が検索したい郵便番号。
  • 「zipcode」がkey
  • 「2500011」がvalue
  • valueを変更すると結果も変わる
  • urlが関数名で引数を渡しているという感じ
  • 返ってくる値がJSON形式
  • エラーの時だけmessageが入る
エンドポイント
  • このURLにリクエストパラメータを加え、リクエストを行う
https://zipcloud.ibsnet.co.jp/api/search
リクエストパラメータ
  • (例)郵便番号「7830060」で検索する場合
https://zipcloud.ibsnet.co.jp/api/search?zipcode=7...
パラメータ名項目名必須備考
zipcode郵便番号7桁の数字。ハイフン付きでも可。完全一致検索。
callbackコールバック関数名-JSONPとして出力する際のコールバック関数名。UTF-8でURLエンコードした文字列。
limit最大件数-同一の郵便番号で複数件のデータが存在する場合に返される件数の上限値(数字) ※デフォルト:20
エラー
  • エラーが発生した場合には、"status"フィールドに下記のエラーコードがセットされ、エラーの内容が"message"フィールドにセットされる
エラーコード説明
400入力パラメータエラー
500API内部で発生したエラー
レスポンスフィールド
  • 文字コードはUTF-8
  • 検索結果が複数存在する場合は、以下の項目が配列として返される
フィールド名項目名備考
statusステータス正常時は 200、エラー発生時にはエラーコードが返される。
messageメッセージエラー発生時に、エラーの内容が返される。
results・zipcode郵便番号7桁の郵便番号。ハイフンなし。
results・prefcode都道府県コードJIS X 0401 に定められた2桁の都道府県コード。
results・address1都道府県名
results・address2市区町村名
results・address3町域名
results・kana1都道府県名カナ
results・kana2市区町村名カナ
results・kana3町域名カナ

JSON関連の一時メモ

基本的なこと

  • keyとvalueがセットになっている
  • valueの種類には文字列、数値、配列、連想配列(オブジェクト)がある
  • 文字列
    • シングルクォート(')かダブルクォート(”)で囲む
  • 数字
    • そのまま打ち込む。(何かで囲む必要は無い)
  • 配列
    • []で囲む
    • keyが数字で省略できる。というか省略する。
    • 利用する時には0から始まる
  • 連想配列(オブジェクト)
    • {}で囲む
    • keyが文字
    • keyとvalueの区切りはコロン(:)
  • 配列、連想配列(オブジェクト)共通
    • key,valuセットの区切りはカンマ(,)
    • カンマ最後に付けるとエラーになる
  • 連想配列(オブジェクト)の場合は変数名.keyでvalueを使う。
  • 配列は変数名.key[0]のように数字をカギカッコで囲んで利用する。

jqコマンド(JSONデータの操作)

参考:jqコマンドでjsonから必要なデータのみを取得する
  • jqコマンドとは JSONデータをsedやgrep、awkのようにデータ抽出、変換、集計してくれるツール

HTTP関連の用語

URLエンコード(パーセントエンコーディング)とは

  • パーセントエンコーディングは「URLで使えない文字を%(パーセント)と半角英数字の組み合わせで表現すること」
  • 表記できない文字の文字コードを16進数で表したものを「%」(パーセント記号)に続けて表記し、その文字を置き換える

ajax(Asynchronous JavaScript + XML)とは?

  • javascriptを使って非同期にDOM(htmlタグの事でdivタグ、imgタグ等の事)を操作したり、データを取得する実装の方法の1つ。
  • ajax的アプローチの一部で、WebAPIから都度必要になったデータを取得する事が含まれる。
    • Googleマップで有名になった。

レスポンス(反応)とは?

  • リクエスト受けたサーバがクライアントに返す。
  • リクエストされたデータの中身とか、登録した結果など。
  • ステータスコード(成否とかを数字で表現している)
    • 200:成功
    • 400:リクエストが不正
    • 500:サーバのエラー
  • コンテンツ(html)

HTTPメソッドの種類

GET : リソースの取得
PUT : リソースの作成、リソースの更新
PATCH : リソースの部分更新
DELETE : リソースの削除
HEAD : リソースのメタデータの取得
OPTIONS : リソースがサポートするメソッドを調べる
POSTとは?(リソースの作成)
  • POSTとは、「リソース(情報)を更新・作成する」ためのHTTPメソッド
  • POSTはリクエストボディーにパラメーターを配置するため、パラメーターの長さに上限がない
    • POSTを使ってリクエストしてもGET相当の結果が返ってくるものがある
    • これは長いパラメーターを受け付けるための仕様
    • GETとPOSTを区別するかしないかはWeb APIごとに対応状況が異なる
PUTとは?(リソース(情報)を更新・作成する)
  • POSTと似ていますが、「べき等(何度リクエストしても結果が同じ)」という性質があります。
  • POSTでリソースを新規作成し、PUTで更新するWeb APIが典型的です。
GETとは?(リソース(情報)を取得する)
  • GETとは、「リソース(情報)を取得する」ためのHTTPメソッドです。
  • ウェブサイトをブラウザーで見るとき、内部ではGETによるリクエストが行われています。
  • Web APIも情報を取得する性質のものが多いため、GETをよく使います。

URLパラメーター(クエリ文字列、クエリストリング)とは?

参考:URLパラメータとは?パラメータ使用URLでの注意点
  • URL パラメータとは、データを収集するために URL の末尾に付け加える変数のこと
  • クエリ文字列(URLパラメーター)とは、サーバーに情報を送るためにURLの末尾につけ足す文字列(変数)のこと
  • 「?」 をURLの末尾につけ、その次に「パラメーター=値」をつける
  • 複数のパラメーターをつけたい場合は「&」を使用する
  • この形式で、サーバーに送信したいデータをURLにつけ加えることが可能
https://wwww.example.jp/hogehoge/?category=height
    • 「?」以降の文字列がパラメータ
    • 「category=height」が「変数(パラメータ)=値」
アクティブパラメータとパッシブパラメータ
  • アクティブパラメータ
    • ページのコンテンツを変更する
    • パラメータの種類や指定した値によってページのコンテンツ内容が変化する
  • パッシブパラメータ
    • ページ内容は変わらない
    • ECサイトの商品一覧ページや求人サイトの求人検索結果ページの絞り込む条件で使用する

WebAPI関連の用語

Content-Type (コンテンツタイプ)とは

参考:Content-Typeの一覧
  • 「ファイルの種類を表す情報」が書いてある項目
  • どのような種類のデータが実際に送られたかを伝える
content typeの基本的な構造
参考:Content-typeについて少し勉強してみよう:application/jsonとapplication/x-www-form-urlencodedの違い
  • content typeは基本的に以下の構造で作られる
タイプ/サブタイプ
  • タイプ名でデータの種類(テキスト、画像、動画など)を定義
    • application、audio、text、imageなど
  • サブタイプで定義されたデータ種類の中で、具体的なデータ形式を定義
application/json
  • jsonフォーマットでデータが送受信される
application/x-www-form-urlencoded
  • エンコードされたurlでデータが送受信される
  • a=1&b=1 のようなクエリパラメータの形になる。実際はエンコードされる。
  • 例(utf-8 basis): a=1&b=1 → %20a%3D1%26b%3D1

ユーザーエージェント(User Agent)とは?

  • ユーザーエージェント(User Agent)とは、ウェブサイトへアクセスする際に使用されるプログラム、あるいはそれらを識別するための文字列のこと
  • ネット利用者が使用しているOS・ブラウザのこと
  • 一般的なインターネットブラウザを使い、HTTPに基づきサイトなどにアクセスした際には、ユーザーエージェントに関する各種情報が、相手側に通知される仕組みとなっている

XHR(XMLHttpRequest)とは?

  • JavaScriptなどのウェブブラウザ搭載のスクリプト言語でサーバとのHTTP通信を行うための、組み込みオブジェクト(API)

axios とは?

  • 生のXHRをそのまま扱うとコードが長くなり面倒なので、axiosを利用する
  • axiosはHTTPリクエストを行うためのライブラリ
    • XHRをラップしたAPIで構成されているので、シンプルに記述することができる
  • ブラウザや node.js で動く Promise ベースの HTTP クライアントである。 REST-API を実行したいときなど、これを使うと実装が簡単にできる
  • axiosのbaseURLにルートエンドポイントを設定することで、個別のリソースへのアクセス時にルートパスで指定できる
app.js
const request = axios.create({
  baseURL: 'https://api.github.com'
})

REST API (Representational State Transfer)とは?

  • REST APIはシンプルかつ柔軟で互換性に優れているため、さまざまな種類のデータの取り扱いや、最も著名なアプリケーションとのやり取りに最適というメリットがある
  • RESTful APIとは、Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つで、「REST」(レスト)と呼ばれる設計原則に従って策定されたもの。
  • RESTそのものは適用範囲の広い抽象的なモデルだが、一般的にはRESTの考え方をWeb APIに適用したものをRESTful APIと呼んでいる。

SOAP API ((SimpleObject Access Protocol))とは?

参考:web apiとAPIは別物?web apiの種類やメリットとは
  • SOAPとは、Webサービスを実装する際にHTTPリクエストやレスポンスにXMLフォーマットを使用してデータのやり取りを行うRPCプロトコル
  • プログラミング言語やプラットフォームに依存しないという特徴があり、HTTPだけでなく、SMTPなどの任意の通信プロトコルも使用できる

ルートエンドポイントの設定

  • APIを利用するには、アクセス先のURIが必要で、URIはリソース(参照に値するデータの塊)ごとに1つ(またはそれ以上)割り振られている
  • リソースごとに割り振られたURIのことをエンドポイントという
例)以下にアクセスすることでデータを取得できる

「URL」と「URI」との違い

参考:URLとURIの違いとは!今更聞けないWebの基礎知識を解説します!
  • URIとは、「Uniform Resource Identifier(ユニフォーム・リソース・アイデンティファイア)」の略でインターネット上に存在するあらゆるファイルを識別する総称のこと
  • 「URL」と「URN」ありそれらを合わせた概念が「URI」
  • URL=Web上の住所(アドレス)
  • URN=Web側で認識されている名前(ファイルの名前)
  • URI=URL+URIという関係性

URN(Uniform Resource Name(ユニフォーム・リソース・ネーム))とは?

  • URNとはインターネット上に存在するあらゆるファイルの名前を示すもの
  • URNは基本的に固定の名前-Webサイトを制作し、場所を引っ越しすればURLは変更になるが、URNは変更されない。
  • URNはWeb側で認識されている名前

登録したアプリケーションIDを渡す

User-Agent方式
  • User-Agentヘッダーの末尾に以下の形式で埋め込むことでアプリケーションIDを渡します。
User-Agent: <元のUser-Agent文字列>; Yahoo AppID: <あなたのアプリケーションID>
  • User-Agentがもともと空の場合
User-Agent: Yahoo AppID: <あなたのアプリケーションID>
URLパラメーター方式
  • GETリクエストと同じようにURLパラメーターとしてアプリケーションIDを渡すこともできます。
  • こちらの方が手軽で、ヘッダーを操作できない場合でも使うことができます。
appid=<あなたのアプリケーションID>

Web APIへのパラメーターの渡し方

  • Web APIは渡されたパラメーターによって出力が変わります。
  • 特に明示されていないWeb APIは、application/x-www-form-urlencoded形式のパラメーターをサポートしている
appid=<YOUR_APPID>&<リクエストパラメーター>=<パーセントエンコーディング形式に変換されたパラメーターの値>
1.Web APIドキュメントをもとに、必要なリクエストパラメーターと、渡したい文字列を書き出します。
sentence 明鏡止水
2.パラメーター名と、パラメーターの値をそれぞれパーセントエンコーディング形式に変換します。
sentence %E6%98%8E%E9%8F%A1%E6%AD%A2%E6%B0%B4
3.変換結果を「=」で連結します。このときに使う「=」は、エンコードしてはいけません
sentence=%E6%98%8E%E9%8F%A1%E6%AD%A2%E6%B0%B4
4.各パラメーターについて1〜3を行い、最後に「&」で連結します。この「&」もエンコードしてはいけません。
appid=YOUR_APPID&sentence=%E6%98%8E%E9%8F%A1%E6%AD%A2%E6%B0%B4
  • 日本語の文字列などはUTF-8で渡す
  • PHPの場合、http_build_query(外部リンク)という標準関数で簡単にクエリーストリングを作ることができます。
  • POSTの場合、作成したクエリーストリングをそのままリクエストボディーとして渡します。

レスポンスの解析

  • Web APIのレスポンスはXMLやPHPSerialize、JSONといったテキスト形式になっています。
  • 対応している形式はWeb APIによって異なります。
  • いずれも汎用的なデータフォーマットですので、お好きなツール・ライブラリを使って解析してください。

PHP + cURL + SimpleXML によるサンプル

<?php
/**
* ルビ振りAPIへのリクエストサンプル(POST)
*
*/
$api = 'http://jlp.yahooapis.jp/FuriganaService/V1/furigana';
$appid = '<あなたのアプリケーションID>';
$params = array(
  'sentence' => '明鏡止水'
);

$ch = curl_init($api);
curl_setopt_array($ch, array(
  CURLOPT_POST           => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_USERAGENT      => "Yahoo AppID: $appid",
  CURLOPT_POSTFIELDS     => http_build_query($params),
));

$result = curl_exec($ch);
curl_close($ch);
?>
<pre>
<?php echo htmlspecialchars(
           print_r(new SimpleXMLElement($result), true)
         ) ?>
</pre>
  • cURLを利用する場合、自動的にContent-TypeやContent-Lengthが設定されます。
  • 出力は以下のようになります。
<pre>
SimpleXMLElement Object
(
  [Result] => SimpleXMLElement Object
      (
          [WordList] => SimpleXMLElement Object
              (
                  [Word] => SimpleXMLElement Object
                      (
                          [Surface] => 明鏡止水
                          [Furigana] => めいきょうしすい
                          [Roman] => meikyousisui
                      )
              )
      )
)
</pre>

ニコニコ動画APIについて

参考:ニコニコ動画のAPIまとめ
参考:ニコ動マイリスト系APIまとめ
参考:ニコニコ動画API
  • スナップショット検索API
    • ニコニコ動画の動画を検索するための公式公開API
    • 現在は「スナップショット検索API v2exit」へと置き換えられた
  • JSONをPOSTすることで、特定のキーワードやフィルタ条件に合致する動画の情報を一括で取得できる

公式で利用されているAPIの一覧

  • getthumbinfo(動画の情報を取得)
https://ext.nicovideo.jp/api/getthumbinfo/sm*
  • getflv(指定された動画のFLV保管URLを取得)
https://flapi.nicovideo.jp/api/getflv/sm*
  • msg(指定した動画のコメントを取得)
http://msg.nicovideo.jp/**/api

スナップショット検索API v2(ニコニコ動画のAPI)

  • 日時のフォーマットが厳格化さた。ISO 8601形式のうち、YYYY-MM-DDThh:mm:ss±hh:mmのフォーマットで指定する
  • キーワードやフィルタ条件を指定して、動画を検索できます。 当APIの検索結果は、毎日AM5:00に更新される動画検索インデックスから返されます。

ヘッダー

  • User-Agentにサービス名またはアプリケーション名を指定する

クエリパラメータ

  • 以下のパラメータを GET のクエリパラメータで与える

レスポンス

  • 以下のJSONが返ってきます。
正常な場合

エラーの場合
  • status: 400
    • 不正なパラメータです。
  • status: 500
    • 検索サーバの異常です。
  • status: 503
    • サービスがメンテナンス中です。メンテナンス終了までお待ち下さい。

便利ツール

Talend API Tester(旧 Restlet Client)

参考:【Chrome】ブラウザから簡単にREST APIを叩く方法【Talend API Tester(旧 Restlet Client)】
  • Talend API Testerとは、ブラウザ上でAPIを簡単に叩けるクライアントツール
  • Chromeの機能拡張
  • POST、GET、PUT、DELETEなどのメソッドで、送信パラメーターも簡単に操作して送ることができる
  • 簡単にカテゴリ分けして、再利用も可能
GETの場合

1.GETTを選ぶ
2.エンドポイントのURLを入力する
3.パラメーターを指定する(メソッド、Key、Value)
POSTの場合
  • ヘッダー
  • ボディ

多次元配列の指定方法
参考:【Chrome】Talend API Testerで多次元配列を送る方法【簡単】
  • BODYのキー名を、JSの配列の書き方と同じように、hoge[key]といった感じで書く
    • [{キー名}]を追加していく
  • 1次元の場合→name
  • 2次元の場合→user[name]
  • 3次元の場合→user[0][name]
APIがJSON形式でパラメータを受け取る場合
  • APIが、JSON形式でパラメータを受け付けている場合、多次元配列のパラメータの指定の仕方はさらに簡単
  • JSON形式で「BODY」を入力する場合は、「BODY」の右の方にプルダウンで、「Text」を選択し、「JSON」タブを選択することでJSON形式で入力
よくあるエラー
症状:「No response. Is the certificate valid? Click here to check.」
原因:「https://」から始まるサイトで、SSL証明書切れの場合
対策:ブラウザのアドレスバーにURLを打ち込んで、「{ドメイン名}にアクセスする(安全ではありません)」をクリックしてから、再度Talend API Testerのページで試す

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

【メニュー編集】

スカイリム関連

スカイリム関連


Menu

【メニュー編集】

スクリプト関連

フリーエリア

管理人/副管理人のみ編集できます