【API連携】SSH接続で仕入れ先の在庫情報取得してみた

本日は、AIの助けを借りて API連携 というものに挑戦してみた。

仕事の仕入れ先が、自社の在庫情報をAPIでリアルタイムに提供してくれる・・・
ということなのだが、素人エンジニアの自分には導入方法が意味不明。

昔なら諦めていたところだけど、今は優秀なAIがあるので、なんとかできそう。

ということで、導入までの手順や専門用語などを、備忘録として残しておく。

目次

そもそもAPIとは何か?

APIとは「Application Programming Interface」の略称。
ざっくり言うと、システムとシステムが情報交換するための窓口

例えばGoogle MapのAPI。
Google MapからとあるHTMLコードを自社サイトに埋め込むだけで、地図取得のための複雑なコードを書かずとも、Google Mapと同じ地図情報を表示することができる。

今回の場合は在庫連携API。
実際、商品の在庫情報を取得するには複雑なコードが必要だが、このAPIを経由すれば、商品の品番などを指定するだけで在庫情報(数量など)を取得できる。

使いこなせれば、非常に便利な仕組みだ。

在庫情報取得の最初のステップ

本APIは誰でも自由に利用できるわけではなく、事前に許可されたサーバーからのアクセスのみ受け付けるという仕組み。今回は、自社サイトを運用しているレンタルサーバー(XServer)で利用したいので、そちらのIPアドレスを仕入れ先に伝えて制限を解除してもらった。

IPアドレスはサーバーパネルですぐ確認できた。

制限を解除してもらったら、そのサーバーから仕入れ先のAPIにアクセス。
まずは、ちゃんとアクセスして在庫情報を取得できるか試してみたかったので、SSH接続(離れた場所にあるサーバーを、安全に遠隔操作するための仕組み)でやってみることにした。

AI主導でコマンドを打っていく(PART 1)

まずはこちらのコマンドから。(実際のドメインなどは、適当なものに変更)

nslookup api-gateway.example.com
api-gateway.example.comというAPIのドメイン(窓口)が、実際に存在するかを確認するコマンド。
nslookup:APIのドメインをIPアドレスに変換する(調べる)コマンド。

このコマンドでIPアドレスが返ってきたので、問題はなし。
もしエラーになっていたら、DNSの設定やドメイン名の入力ミスの可能性あり。


次のコマンドはこちら。

curl -I https://api-gateway.example.com
指定したURL(api-gateway.example.com)の『ヘッダー情報』だけを取得して表示するコマンド。
curl:サーバーとデータをやり取りするためのコマンド。

-I:サーバーに対して「中身(Body)はいらないから、ヘッダー情報だけ頂戴」とリクエストするコマンド。–headの略。

結果は「404 Not Found」。
一瞬エラーっぽいが、サーバーが存在して反応してくれた証拠なのでOK。
もし繋がらなければタイムアウトになる。


次は、実際に在庫情報をリクエストしてみるコマンド。

ただし、実はこのAPIはIPアドレス制限の他に、APIゲートウェイ認証という2段階認証になっている。
本来は認証用トークンを発行してから、そのトークンを添えてリクエストするのだが、まずは認証なしで実行してみる。

curl -X POST \
https://api-gateway.example.com/api/stocks/individuals \
-d ‘{“site_code”:”TEST”,”items”:[{“code”:”ITEM01″}]}’

特定のデータを送信(POST)して、何かを登録・更新させるコマンド。
-X POST:特定のデータをサーバーに登録または処理させるコマンド。
-d ‘{“site_code”:”TEST”, …}’:送信するデータ。-dは–dataの略。

結果は予想通りの「{“code”:401,”message”:”Unauthorized”}」。
「Unauthorized(認証してない)」となったが、逆に言えば認証があれば通るということで、問題なし。

まだ在庫情報は取得できていないが、とりあえずIPアドレス制限はクリアできていて、サーバーまで到達できていることが確認できた。

AI主導でコマンドを打っていく(PART 2)

さて、次はAPIゲートウェイ認証をクリアして、実際に在庫情報を取得していくわけだが。
後述の通り、AIを使ってもすんなりとはいかなかった。。。

まずはAPIゲートウェイ認証について。
これは、「APIへの入り口で本人確認と入る許可をチェックする仕組み」のこと。
許可をもらうには、認証専用窓口で「トークン(通行証)」を取得する必要がある。

ということで、以下コマンドでトークンを取得。

ssh user@allowed-server.com
許可されたサーバーへログインするためのコマンド。

curl -s -X POST “https://idcs-xxxx.identity.oraclecloud.com/oauth2/v1/token” \
-H “Authorization: Basic BASE64_CLIENT_CREDENTIALS” \
-H “Content-Type: application/x-www-form-urlencoded;charset=UTF-8” \
-d “grant_type=client_credentials&scope=api-scope:stocks-select”

認証専用窓口にて、トークンを取得するためのコマンド。

結果、長くて複雑な文字列=トークンが返ってきた。
あとはこのトークンを添えて、再び在庫情報をリクエストするだけ。


まず取得したトークンが長すぎるので、一旦変数($TOKEN)に入れてから、在庫取得APIを叩くコマンドを組み立ててみた。

TOKEN=’ここにaccess_tokenを貼る’

curl -s -X POST \
https://api-gateway.example.com/api/stocks/individuals \
-H “Content-Type: application/json” \
-H “Authorization: Bearer $TOKEN” \
-d ‘{“ec_site_code”:”APXX”,”stock_individuals”:[{“product_code”:”1234″}]}’

結果は、「”code”:401,”message”:”Unauthorized”」
あれ、、、在庫情報が取得できない。というか弾かれたっぽい。

ここでトークンは間違っていないかとか、アドレスは正しいかとか、1時間以上格闘。
AIに聞いても、なかなか解決しない。

複数のAIをフル活用してようやく解決。
原因は、「Bearer」が不要という、振り返ればシンプルなミス。
正しくはこちら。

curl -s -X POST \
https://api-gateway.example.com/api/stocks/individuals \
-H “Content-Type: application/json” \
-H “Authorization: $TOKEN” \
-d ‘{“ec_site_code”:”APXX”,”stock_individuals”:[{“product_code”:”1234″}]}’

通常、トークンをセットするときは「Bearer」と一緒に書く(何の認証情報かを識別する)のが一般的だそうですが、今回はそれが不要の設定だったよう。(「Bearer」という文字列を含めず、トークン文字列だけをそのまま送るのがこのAPIの正解だったらしい。知らんわ。。。)

ということで、無事にこちらのコマンドで在庫情報が取得できました。

まとめ

こうやってまとめるとシンプルだが、ただAIからの回答をひたすらコピペするだけだと、仕組みもトラブル原因も理解不能。こうして一段階ずつ分けて理解してを繰り返すことで、仕組みや原因も特定しやすくなるなーと思った。

何はともあれ、無事に目的が達成できてよかった。。。
答えが気軽に得られるAI時代だからこそ、面倒でも必要なステップだね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次