Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 1 year has passed since last update.

PythonでAPIたたく

Last updated at Posted at 2021-11-11

pythonでAPIたたく備忘録

殴り書いていきます

api_sample.py

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, "結果コード失敗")

解説

独自例外はまぁいいとして

ここ

.py
    headers = {'ContentTypeとか。外だししとけ'}
    data = json.dumps(request)

これで、リクエストのheaderと、リクエストデータをjsonで用意します
jsonはimport必要

つぎに

.py
    req = urllib.request.Request(url, data.encode(), headers)
    body_dict = None

リクエストデータを送信するためのurllibで送信用オブジェクトを作る
urllibはimport必要
同時に返却オブジェクトの受け皿をつくっとく

で投げる

.py
    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です。

失敗したら独自例外をスローするように書いてますね

最後に

.py
    # 結果をハンドリング
    # 結果コード「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_keyinfoを指定すれば、「連携データ」を勝手に返却してくれるようにできるかなと

data_keyを、postメソッドの引数でNoneで初期化してるので、なければNoneを返却しちゃってます(メソッドコメントとちがうやんけ!)

で、結果コードが正常でなければ
if body_dict.get('res_cd') == 0:
の条件外なので、独自例外をraiseしていく。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?