🎓 レベル:標準 | 重要度:A(必須) 📎 前提:HTTP/HTTPS
要点(BLUF)
- REST APIは、HTTPの上に作られた機器/コントローラ操作の標準的な口です。URL=対象、HTTPメソッド=操作という対応で動きます。
- 操作はCRUD(Create/Read/Update/Delete)で、GET=参照・POST=作成・PUT/PATCH=更新・DELETE=削除に対応します。
- データのやり取りはJSONが主流。キーと値の構造で、人にも機械にも読みやすい形です。
RESTの考え方:URLとメソッド
RESTでは、操作したい対象(リソース)をURLで指し、何をするかをHTTPメソッドで表します。
| 操作(CRUD) | HTTPメソッド | 例 |
|---|---|---|
| Read(参照) | GET | GET /api/interfaces |
| Create(作成) | POST | POST /api/interfaces |
| Update(更新) | PUT / PATCH | PUT /api/interfaces/Gi0-1 |
| Delete(削除) | DELETE | DELETE /api/interfaces/Gi0-1 |
レスポンスには[[05-02_HTTP_HTTPS]]のステータスコードが付きます(200成功・201作成・401認証要・404未検出など)。認証はトークンやAPIキーをヘッダに添えるのが一般的です。
graph LR S["スクリプト/アプリ"] C["コントローラ(REST API・HTTPS)"] S -->|"GET /api/devices (トークン付き)"| C C -->|"200 OK + JSON本文"| S
JSON:データの運び方
JSONは「キーと値」「配列」「入れ子」で構造化データを表します。Python標準の json で解析できます(言語明示)。
import json
# コントローラが返す機器一覧を模したJSON
payload = '''
{
"devices": [
{"hostname": "R1", "mgmt_ip": "192.168.20.1", "role": "router", "up": true},
{"hostname": "SW1", "mgmt_ip": "192.168.20.2", "role": "switch", "up": false}
],
"count": 2
}
'''
data = json.loads(payload) # JSON文字列 -> Pythonの辞書
print("count:", data["count"])
for d in data["devices"]:
state = "up" if d["up"] else "down"
print(f"{d['hostname']:4} {d['mgmt_ip']:14} {d['role']:7} {state}")
# 逆向き: Pythonの辞書 -> JSON文字列(POST本文を組み立てる)
new_if = {"name": "Gi0/1", "vlan": 10, "enabled": True}
print("body:", json.dumps(new_if))
実行結果:
count: 2
R1 192.168.20.1 router up
SW1 192.168.20.2 switch down
最後の json.dumps 行はこの後に続けて出力されます:
body: {"name": "Gi0/1", "vlan": 10, "enabled": true}
注目:JSONの true/false/null は、Pythonでは True/False/None に対応します。json.loads が文字列を辞書に、json.dumps が辞書を文字列に変換し、APIとPythonの世界を橋渡しします。
JSONの構文ルール
- キーは必ずダブルクォートの文字列。
- 値は文字列・数値・真偽値(
true/false)・null・配列[]・オブジェクト{}。 - 末尾カンマは不可、コメントも不可(厳格)。
XMLやYAMLも使われますが、REST APIではJSONが事実上の標準です(YAMLは設定ファイル、XMLはNETCONFで多い)。
なぜRESTとJSONが標準なのか(設計の直観)
RESTは既存のHTTPの仕組み(URL・メソッド・ステータス)をそのまま流用するため、新しい通信規約を覚えずに済み、Webの道具(ブラウザ・curl・ライブラリ)がそのまま使えます。JSONは人が読めて機械が解析しやすいちょうど中間の表現で、どの言語にもパーサがあります。「既存の枯れた技術を組み合わせて、学習コストを最小化する」——これが自動化を一気に普及させた設計判断です。
⚠️ よくある誤解
- 「GETでもデータを変更できる」ではない。GETは参照(安全・冪等)が原則。変更はPOST/PUT/DELETE。混ぜると事故ります。
- 「JSONのキーはクォート無しでよい」ではない。JSONは厳格で、キーは必ずダブルクォート。JavaScriptのオブジェクトリテラルとは別物です。
- 「REST APIは平文で十分」ではない。認証トークンが流れるためHTTPS必須。
[[05-02_HTTP_HTTPS]]の暗号化が前提です。
対応 lab
[[networking-study/labs/09-02_json_parse.py]]— JSONの解析と生成(loads/dumps)
関連
- 下層HTTP:
[[05-02_HTTP_HTTPS]]/コントローラ:[[09-01_SDNとコントローラベース]] - 次:
[[09-03_自動化ツールとAIネットワーキング]]