APIって一体何?と質問されたら、あなたは答えられますか?
「名前は聞いたことある!」とか「なんとなくなら理解している」という方、結構いらっしゃるかと思います。
ここではなんとなくで理解しているAPIを今一度整理し「説明できる」くらいまで知識を昇華させていきたいと思います。
APIとは?
APIとは「Application Programming Interface」の頭文字を取った言葉です。インターフェースとは「受け口」のことです。つまりAPIとは「アプリケーションプログラムの受け口」です。もう少し砕いて言うなら「アプリの機能を外から呼び出すお約束事」のことです。
例えばAアプリがBアプリ内のデータを使いたいとします。そういった場合、Bアプリが内部のデータをAPIとして外部に公開していれば、AアプリはBアプリのAPIを通してデータを扱うことができます。その外部への公開方法がAPIと呼ばれるものです。
APIの中でもWebサイト上でやり取りするAPIを「Web API」と呼びます。ここではWeb APIを元にAPIについて解説します。
APIの通信方式(メソッド)
クライアントとサーバがやり取りする際はHTTP通信をしますが、APIでも同じです。
HTTPにはいくつかの通信するための仕様が取り決められています。一つずつ見ていきましょう。
GET
GETはリソースを取得するための通信方式です。ここで言うリソースとは「文字や画像、動画などのメディアコンテンツ」のことです。
なんらかの情報を取得したい場合はこのGETメソッドを使います。GETはURLの「?」以降にパラメータを指定してサーバにリクエストします。
例えば次のようなイメージです。
https://myafu-python.com/?s=python
?以降のs=pythonがパラメータです。sという変数にpythonという文字列を代入して、サーバに渡していると考えて良いでしょう。このサーバに渡った変数をプログラムに渡して必要な情報をデータベースなどから取得し、結果をクライアントに返却するというのが基本的な動きになります。
GETメソッドはパラメータをURLで送るので、ブックマークすることができるというメリットがあります。
POST
POSTは主にデータベースやテキストファイルにデータを登録する際に使われる通信方式です。
GETとの最大の違いはパラメータの受け渡し方法で、GETがURLの末尾に付け加えるのに対して、POSTは「メッセージボディ」という場所にパラメータを格納します。
メッセージボディはそのWebサイトを見ているユーザからは見えないので、データ登録する場合セキュリティ上GETよりも良いということ、さらに、GETと違ってデータ量に制限がないことから、データ登録時はPOSTが使われています。
PythonでGET, POSTするには?
PythonでGETやPOSTを実行するにはrequestsライブラリを使うと便利です。requestsはPythonで簡単にHTTP通信をできるようにするために作られたライブラリです。
requestsを使うにはインストールが必要です。pipを使っている場合は次のコマンドでインストールできます。
$ pip install requests
requestsについてはこちらのページでも解説していますので、覗いてみてくださいね。
requestsを使ったGET
requestsではrequests.get()を使うことでGETリクエストを送れます。
import requests
res = requests.get('https://www.google.com/')
print(res.text) #レスポンスを文字列で取得
[出力結果]
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content ...省略
上記は最も基本的なrequests.get()の使い方です。urlを指定してhtmlを取得しています。
また、JSON形式でレスポンスを取得したい場合はリクエストヘッダにcontent-typeの指定が必要です。
import requests
headers = {"content-type": "application/json"}
res = requests.get('http://example.com/example.json', headers=headers)
print(res.text) #レスポンスを文字列で取得
requestsを使ったPOST
POSTリクエストを送りたい場合はrequests.post()を使います。
import requests
data = {
'id':'1',
'name':'sato',
'mail':'example@mail.com'
}
res = requests.post('http://example.com', data=data)
print(res.status_code)
[出力結果]
200
requests.post()の一つ目の引数にURLを指定し、dataに辞書形式でデータを渡しています。
この後はサーバ側で渡されたパラメータのチェックをして、問題なければデータベースやテキストファイルなどへの登録処理が実行されます。
実行結果に問題がなかったかどうかを確認する方法にステータスコードを見るという選択肢があります。返ってきたresponseのstatus_codeを参照することで、ステータスコードを確認できます。