最終更新: kenken2020 2022年01月02日(日) 12:12:37履歴
目次
- Web APIとは?
- WebAPIにアクセスする方法
- 自前のWebAPIを作る場合
- サンプル・テスト
- JSON関連の一時メモ
- HTTP関連の用語
- WebAPI関連の用語
- YahooWebAPIに関するメモ
- ニコニコ動画APIについて
- スナップショット検索API v2(ニコニコ動画のAPI)
- 便利ツール
- API(Application Programming Interface)とは、サービスのデータを外部のアプリケーションやプログラムから扱うための機能を提供するインターフェース
- その中でも、HTTP通信によってやりとりを行うAPIをWeb APIという
- Web APIは普通のWebサイトへのアクセスと同じように、HTTPプロトコルを利用し、リクエストとレスポンスによってやりとりを行う
- よってHTTP通信が可能な環境であれば、ブラウザに限らずどのような環境からもWeb APIにアクセスが可能
1、WebAPIを使うアプリケーションをWebAPIサイトに登録する(どのアプリケーションからの利用か判別するため)
2、APIキー、APIシークレットを取得して、アプリケーションに設定する(IDとパスワードのようなもの)
3、実際に操作してみる
2、APIキー、APIシークレットを取得して、アプリケーションに設定する(IDとパスワードのようなもの)
3、実際に操作してみる
- クライアントから
- httpで
- リクエストして
- サーバー処理して
- レスポンスが返ってくる
参考:APIクライアント開発時のモックに使えるhttpbinの紹介
- httpbin は高機能なレスポンスをJSONで返してくれるサイト
- トップページを見ると、返してくれるエンドポイントの一覧が見られる。
- 自分が送ったパラメータやヘッダー情報をレスポンスしてくれるため、正しくリクエストされているかどうかを簡易的に確認するのに最適
$ curl -s -X GET "url" \ -H "accept: application/json" \ -H "toke: *****" \ -H "id: *****" | jq
参考:【2021年最新】作りたいアプリ別API一覧を全紹介〜随時更新〜
参考:個人でも使える!おすすめAPI一覧
参考:APIの使い方まとめ
参考:個人でも使える!おすすめAPI一覧
- GitHub API(REST API v3)
- Google Maps API
- 事前にAPIキーを取得する必要がある
- 参考:Google Maps API を使ってみた
参考:APIの使い方まとめ
- おそらく「curlコマンド」を使ったほうがいい?
- 「Telnet」は、ネットワークを介して2つのホスト間で通信を行うためのプロトコル
- Telnetは、管理作業などを行うためにネットワーク経由でリモートのマシンへ「Telnetプロトコル」(→プロトコル規格書)でログオンする場合にしばしば用いられてきたツール
- 現在では通信を暗号化できるSSHで代替されることが多い
$ telnet <接続先IPアドレス> <ポート番号>
- Webサーバなら80番
- なのでYahooAPIを使う場合は以下
telnet jlp.yahooapis.jp 80
参考:【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コマンドでapiを叩く
- curlコマンドとはサーバから、もしくはサーバへデータ転送を行うコマンド
- curlはlibcurlの機能を利用して、コマンドラインやスクリプトからデータの転送を行うためのコマンドラインツール
- libcurlはHTTP/HTTPSをはじめとする多くのプロトコル、各種の認証方式をサポートし、ファイル転送の中断と再開などの機能を持つライブラリ
- 書式
curl [options] [URL]
- APIに対してPOSTでリクエストを行う場合には-X POSTを指定する。
- パラメータをつけてPOSTでリクエストを行う場合には、-dでパラメータを指定する。
curl -X POST [url] -d "name=hoge"
curl -X POST [url] -d "name=hoge&age=20"
参考:WebAPIについての説明
- サーバーと処理ファイル用意すれば自前のWebAPIを作れる
- ローカルで試す場合はMAMPとかXAMPを使う?
- URLはどうする。通常データは名詞にする。
- リクエストデータの構成。
- keyとvalue
- レスポンスデータの構成
- JSONかXMLか
- keyとvalue
- エラー時のレスポンス
- レスポンスデータ内で表現するか
- httpステータスコードで表現するか
- リクエストと一緒に渡されたデータを取得
- リクエストデータの検証とか解析
- リクエストの検証の部分は、有名なSQLインジェクション(DBを削除出来る攻撃)を防ぐ意味でも必要
- レスポンスデータの値を作成
- 通常はDBの操作(検索、追加、変更、削除)
- レスポンスデータの作成
- 場合によってはレスポンスデータの検証
- 検索結果0件の場合とか
- 変更が正しく行われなかったか.
- JSON形式でレスポンスを返す
- URLは?
- 何のデータをどうやって渡すか
- keyは?
- valueの形式や中身は
- 何のデータがどんな形で返ってくるか
- jsonの形式の場合
- keyは
- valueの形式や中身は
- 一昔前はresultを付けて返す事が多かった。
- 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ファイルでは無く、クライアント側のデベロッパーツールとかで確認
- 但しフレームワークとか使ってる場合は、上記にあてはまらない事が多い
参考:郵便番号検索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 | 入力パラメータエラー |
500 | API内部で発生したエラー |
- 文字コードは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 | 町域名カナ |
- keyとvalueがセットになっている
- valueの種類には文字列、数値、配列、連想配列(オブジェクト)がある
- 文字列
- シングルクォート(')かダブルクォート(”)で囲む
- 数字
- そのまま打ち込む。(何かで囲む必要は無い)
- 配列
- []で囲む
- keyが数字で省略できる。というか省略する。
- 利用する時には0から始まる
- 連想配列(オブジェクト)
- {}で囲む
- keyが文字
- keyとvalueの区切りはコロン(:)
- 配列、連想配列(オブジェクト)共通
- key,valuセットの区切りはカンマ(,)
- カンマ最後に付けるとエラーになる
- 連想配列(オブジェクト)の場合は変数名.keyでvalueを使う。
- 配列は変数名.key[0]のように数字をカギカッコで囲んで利用する。
参考:jqコマンドでjsonから必要なデータのみを取得する
- jqコマンドとは JSONデータをsedやgrep、awkのようにデータ抽出、変換、集計してくれるツール
- パーセントエンコーディングは「URLで使えない文字を%(パーセント)と半角英数字の組み合わせで表現すること」
- 表記できない文字の文字コードを16進数で表したものを「%」(パーセント記号)に続けて表記し、その文字を置き換える
- javascriptを使って非同期にDOM(htmlタグの事でdivタグ、imgタグ等の事)を操作したり、データを取得する実装の方法の1つ。
- ajax的アプローチの一部で、WebAPIから都度必要になったデータを取得する事が含まれる。
- Googleマップで有名になった。
- リクエスト受けたサーバがクライアントに返す。
- リクエストされたデータの中身とか、登録した結果など。
- ステータスコード(成否とかを数字で表現している)
- 200:成功
- 400:リクエストが不正
- 500:サーバのエラー
- コンテンツ(html)
GET : リソースの取得
PUT : リソースの作成、リソースの更新
PATCH : リソースの部分更新
DELETE : リソースの削除
HEAD : リソースのメタデータの取得
OPTIONS : リソースがサポートするメソッドを調べる
PUT : リソースの作成、リソースの更新
PATCH : リソースの部分更新
DELETE : リソースの削除
HEAD : リソースのメタデータの取得
OPTIONS : リソースがサポートするメソッドを調べる
- POSTとは、「リソース(情報)を更新・作成する」ためのHTTPメソッド
- POSTはリクエストボディーにパラメーターを配置するため、パラメーターの長さに上限がない
- POSTを使ってリクエストしてもGET相当の結果が返ってくるものがある
- これは長いパラメーターを受け付けるための仕様
- GETとPOSTを区別するかしないかはWeb APIごとに対応状況が異なる
- POSTと似ていますが、「べき等(何度リクエストしても結果が同じ)」という性質があります。
- POSTでリソースを新規作成し、PUTで更新するWeb APIが典型的です。
- GETとは、「リソース(情報)を取得する」ためのHTTPメソッドです。
- ウェブサイトをブラウザーで見るとき、内部ではGETによるリクエストが行われています。
- Web APIも情報を取得する性質のものが多いため、GETをよく使います。
参考:URLパラメータとは?パラメータ使用URLでの注意点
- URL パラメータとは、データを収集するために URL の末尾に付け加える変数のこと
- クエリ文字列(URLパラメーター)とは、サーバーに情報を送るためにURLの末尾につけ足す文字列(変数)のこと
- 「?」 をURLの末尾につけ、その次に「パラメーター=値」をつける
- 複数のパラメーターをつけたい場合は「&」を使用する
- この形式で、サーバーに送信したいデータをURLにつけ加えることが可能
https://wwww.example.jp/hogehoge/?category=height
- 「?」以降の文字列がパラメータ
- 「category=height」が「変数(パラメータ)=値」
- アクティブパラメータ
- ページのコンテンツを変更する
- パラメータの種類や指定した値によってページのコンテンツ内容が変化する
- パッシブパラメータ
- ページ内容は変わらない
- ECサイトの商品一覧ページや求人サイトの求人検索結果ページの絞り込む条件で使用する
参考:Content-Typeの一覧
- 「ファイルの種類を表す情報」が書いてある項目
- どのような種類のデータが実際に送られたかを伝える
参考:Content-typeについて少し勉強してみよう:application/jsonとapplication/x-www-form-urlencodedの違い
- content typeは基本的に以下の構造で作られる
タイプ/サブタイプ
- タイプ名でデータの種類(テキスト、画像、動画など)を定義
- application、audio、text、imageなど
- サブタイプで定義されたデータ種類の中で、具体的なデータ形式を定義
- エンコードされたurlでデータが送受信される
- a=1&b=1 のようなクエリパラメータの形になる。実際はエンコードされる。
- 例(utf-8 basis): a=1&b=1 → %20a%3D1%26b%3D1
- ユーザーエージェント(User Agent)とは、ウェブサイトへアクセスする際に使用されるプログラム、あるいはそれらを識別するための文字列のこと
- ネット利用者が使用しているOS・ブラウザのこと
- 一般的なインターネットブラウザを使い、HTTPに基づきサイトなどにアクセスした際には、ユーザーエージェントに関する各種情報が、相手側に通知される仕組みとなっている
- 生のXHRをそのまま扱うとコードが長くなり面倒なので、axiosを利用する
- axiosはHTTPリクエストを行うためのライブラリ
- XHRをラップしたAPIで構成されているので、シンプルに記述することができる
- ブラウザや node.js で動く Promise ベースの HTTP クライアントである。 REST-API を実行したいときなど、これを使うと実装が簡単にできる
- axiosのbaseURLにルートエンドポイントを設定することで、個別のリソースへのアクセス時にルートパスで指定できる
const request = axios.create({ baseURL: 'https://api.github.com' })
- REST APIはシンプルかつ柔軟で互換性に優れているため、さまざまな種類のデータの取り扱いや、最も著名なアプリケーションとのやり取りに最適というメリットがある
- RESTful APIとは、Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つで、「REST」(レスト)と呼ばれる設計原則に従って策定されたもの。
- RESTそのものは適用範囲の広い抽象的なモデルだが、一般的にはRESTの考え方をWeb APIに適用したものをRESTful APIと呼んでいる。
参考:web apiとAPIは別物?web apiの種類やメリットとは
- SOAPとは、Webサービスを実装する際にHTTPリクエストやレスポンスにXMLフォーマットを使用してデータのやり取りを行うRPCプロトコル
- プログラミング言語やプラットフォームに依存しないという特徴があり、HTTPだけでなく、SMTPなどの任意の通信プロトコルも使用できる
- APIを利用するには、アクセス先のURIが必要で、URIはリソース(参照に値するデータの塊)ごとに1つ(またはそれ以上)割り振られている
- リソースごとに割り振られたURIのことをエンドポイントという
- 特定ユーザー
- 特定ユーザー
- ドキュメントに記載されるエンドポイントは、/users/:usernameのようにルートパスになっていることが多い
- APIのルートエンドポイントであるhttps://api.github.com部分は省略できたほうがコードの見通しもよくなる
参考:URLとURIの違いとは!今更聞けないWebの基礎知識を解説します!
- URIとは、「Uniform Resource Identifier(ユニフォーム・リソース・アイデンティファイア)」の略でインターネット上に存在するあらゆるファイルを識別する総称のこと
- 「URL」と「URN」ありそれらを合わせた概念が「URI」
- URL=Web上の住所(アドレス)
- URN=Web側で認識されている名前(ファイルの名前)
- URI=URL+URIという関係性
- URNとはインターネット上に存在するあらゆるファイルの名前を示すもの
- URNは基本的に固定の名前-Webサイトを制作し、場所を引っ越しすればURLは変更になるが、URNは変更されない。
- URNはWeb側で認識されている名前
- User-Agentヘッダーの末尾に以下の形式で埋め込むことでアプリケーションIDを渡します。
User-Agent: <元のUser-Agent文字列>; Yahoo AppID: <あなたのアプリケーションID>
- User-Agentがもともと空の場合
User-Agent: Yahoo AppID: <あなたのアプリケーションID>
- GETリクエストと同じようにURLパラメーターとしてアプリケーションIDを渡すこともできます。
- こちらの方が手軽で、ヘッダーを操作できない場合でも使うことができます。
appid=<あなたのアプリケーションID>
- 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%B43.変換結果を「=」で連結します。このときに使う「=」は、エンコードしてはいけません。
sentence=%E6%98%8E%E9%8F%A1%E6%AD%A2%E6%B0%B44.各パラメーターについて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 /** * ルビ振り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
- 現在は「スナップショット検索API v2exit」へと置き換えられた
- JSONをPOSTすることで、特定のキーワードやフィルタ条件に合致する動画の情報を一括で取得できる
- getthumbinfo(動画の情報を取得)
https://ext.nicovideo.jp/api/getthumbinfo/sm*
- getflv(指定された動画のFLV保管URLを取得)
https://flapi.nicovideo.jp/api/getflv/sm*
- msg(指定した動画のコメントを取得)
http://msg.nicovideo.jp/**/api
- 日時のフォーマットが厳格化さた。ISO 8601形式のうち、YYYY-MM-DDThh:mm:ss±hh:mmのフォーマットで指定する
- キーワードやフィルタ条件を指定して、動画を検索できます。 当APIの検索結果は、毎日AM5:00に更新される動画検索インデックスから返されます。
- クライアントツール
- DHC REST Client
- Advanced REST client
- URLエンコード・デコードフォーム
参考:【Chrome】ブラウザから簡単にREST APIを叩く方法【Talend API Tester(旧 Restlet Client)】
- Talend API Testerとは、ブラウザ上でAPIを簡単に叩けるクライアントツール
- Chromeの機能拡張
- POST、GET、PUT、DELETEなどのメソッドで、送信パラメーターも簡単に操作して送ることができる
- 簡単にカテゴリ分けして、再利用も可能
参考:【Chrome】Talend API Testerで多次元配列を送る方法【簡単】
- BODYのキー名を、JSの配列の書き方と同じように、hoge[key]といった感じで書く
- [{キー名}]を追加していく
- 1次元の場合→name
- 2次元の場合→user[name]
- 3次元の場合→user[0][name]
- APIが、JSON形式でパラメータを受け付けている場合、多次元配列のパラメータの指定の仕方はさらに簡単
- JSON形式で「BODY」を入力する場合は、「BODY」の右の方にプルダウンで、「Text」を選択し、「JSON」タブを選択することでJSON形式で入力
コメントをかく