pythonでAPIたたく備忘録
殴り書いていきます
class AAAAAException(Exception):
"""独自例外"""
def __init__(self, code=-1, message=None):
"""
コンストラクタ
Args:
code (int): API結果コード値
message (string): APIエラーメッセージ
"""
super().__init__(message)
self.code = code
class AAAAAApi:
def post(self, url, request, data_key=None):
"""
送信するだけのクラス
Args:
url (str): 呼出しAPIのURL
request (dict): リクエストパラメータ
data_key (str): レスポンスJSONから取得したいデータの項目名
Returns:
object : data_keyがある場合は取得しデータ
ない場合は取得結果全量
Raises:
AAAAAException: 通信エラー、処理結果が異常の場合
"""
headers = {'ContentTypeとか。外だししとけ'}
data = json.dumps(request)
req = urllib.request.Request(url, data.encode(), headers)
body_dict = None
try:
with urllib.request.urlopen(req) as res:
body = res.read().decode()
body_dict = json.loads(body)
except (urllib.error.URLError, json.decoder.JSONDecoderError) as exp:
raise AAAAAException(message='失敗でぇ~す') from exp
# 結果をハンドリング
# 結果コード「res_cd」が成功ならうんたらーって処理を書く
if body_dict.get('res_cd') == 0:
if data_key:
return body_dict.get(data_key)
return None
# 結果コードが成功でなければ例外なげちゃえ
raise AAAAAException(2, "結果コード失敗")
解説
独自例外はまぁいいとして
ここ
headers = {'ContentTypeとか。外だししとけ'}
data = json.dumps(request)
これで、リクエストのheaderと、リクエストデータをjsonで用意します
jsonはimport必要
つぎに
req = urllib.request.Request(url, data.encode(), headers)
body_dict = None
リクエストデータを送信するためのurllib
で送信用オブジェクトを作る
urllibはimport必要
同時に返却オブジェクトの受け皿をつくっとく
で投げる
try:
with urllib.request.urlopen(req) as res:
body = res.read().decode()
body_dict = json.loads(body)
except (urllib.error.URLError, json.decoder.JSONDecoderError) as exp:
raise AAAAAException(message='失敗でぇ~す') from exp
urllib.request.urlopen(req)
が例外検知対象です。
urlをopenするんですねぇ
で成功したらdecodeしてloadです。
失敗したら独自例外をスローするように書いてますね
最後に
# 結果をハンドリング
# 結果コード「res_cd」が成功ならうんたらーって処理を書く
if body_dict.get('res_cd') == 0:
if data_key:
return body_dict.get(data_key)
return None
# 結果コードが成功でなければ例外なげちゃえ
raise AAAAAException(2, "結果コード失敗")
ここで、結果コードが成功なら、取得キーで情報取得。
想定は
result_code:"0"
message : ""
info : 「連携データ」
other : ""
auth_info : ""
みたいなデータ構造のとき
data_key
にinfo
を指定すれば、「連携データ」を勝手に返却してくれるようにできるかなと
data_keyを、postメソッドの引数でNoneで初期化してるので、なければNoneを返却しちゃってます(メソッドコメントとちがうやんけ!)
で、結果コードが正常でなければ
if body_dict.get('res_cd') == 0:
の条件外なので、独自例外をraiseしていく。