Notes開発者のためのXPagesデザインレシピ

簡単でCoolなXPagesアプリケーションを作るための情報を発信していきます

Python REST API

Domino Data Access(REST API)を使って、PythonからDominoサーバーへアクセスするためのサンプルコード集(ビュー編)

はじめに

 DominoServerに保存したデータにRESTAPIでアクセスする方法は、複数ありますが一番安上がりで簡単なのはDomino Data Accessではないかと思います。出力されるフォーマットが最初から決まっていたり、細かいセキュリティ制限が付けられないという制限はありますが、HTTPサービスを起動するだけで使えるというのは魅力です。
 さて、今回Domino Data Accessを取り上げたのは、HCLから提供されているサンプルコードがCurlを使ったもののみで、現代のメジャー言語であるPythonやTypeScript(JavaScript)で提供されていないからです。(もしかしたらあるかもしれませんが、サクッ検索した感じでは見当たりませんでした。)

【Domino Data Accessに関する資料】
HCL Domino REST API 利用ガイド | PPT (slideshare.net)
技術資料: Domino Access Services (REST サービス) 利用ガイド (hcltechsw.com)
HCL Notes and Domino Application Development wiki : IBM Domino Access Services 9.0.1 (hcltechsw.com)

 今回提供するのは、あくまでサンプルコードのみです。利用シーンなどは御自身の環境に合わせてご検討下さい。Domino Data Access環境の構築などは上記、公式資料を参考にして下さい。Python環境の構築などは生成AIに聞くなり何なりして下さい。
※インターネット上に公開されているDominoサーバーで実行する方は、セキュリティに十分注意して下さい。(インターネットは無法地帯です。)

セッション認証ログイン

 ベーシック認証は使われているケースが少ないと思いますので、今回はセッション認証のログインを行います。今回はサンプルコードなのでソースコード内にユーザーID、パスワードを指定していますが、本番では環境変数など別の場所に記述して下さい。

"""
Overview:
    セッション認証でログインし、成功、失敗をコンソールに表示

"""
import requests

# 定数宣言
HOST_URL = 'https://www.hogehoge.com/'
DB_PATH = 'hoge/hoge.nsf'
USER_NAME = '(任意)'
USER_PW = '(任意)'


def create_session():
    """
    Summary:
        セッション認証を行い、セッションとレスポンスを返す
    Args:
        (なし)
    Returns:
        session     :セッション
        response    :レスポンス
    """
    # ログインペイロードの作成
    payload = {
        'username': USER_NAME,
        'password': USER_PW
    }

    # ログインリクエストを送信してセッションを確立
    session = requests.Session()
    response = session.post(HOST_URL + '?Login', data=payload)

    return session, response


def main():
    # セッション認証を行う
    session, response = create_session()

    # レスポンスコードから成否を判定
    if response.status_code == 200:
        print('Success!!')
    else:
        print('Login failed:', response.status_code)


if __name__ == '__main__':
    main()

データベース一覧の取得

 サーバー上のデータベース一覧を取得することができます。公開アドレス帳のDomino Data Accessの設定を有効化すると全てのデータベース一覧が見えてしまうのでセキュリティ的にはあまり良いとは言えません。細かいセキュリティ制御を行いたい場合はProject KEEPなどを使う方が良いかもしれません。

"""
Overview:
    データベース一覧の取得

"""
import requests

# 定数宣言
HOST_URL = 'https://www.hogehoge.com/'
DB_PATH = 'hoge/hoge.nsf'
USER_NAME = '(任意)'
USER_PW = '(任意)'


def create_session():
    """
    Summary:
        セッション認証を行い、セッションとレスポンスを返す
    Args:
        (なし)
    Returns:
        session     :セッション
        response    :レスポンス
    """
    # ログインペイロードの作成
    payload = {
        'username': USER_NAME,
        'password': USER_PW
    }

    # ログインリクエストを送信してセッションを確立
    session = requests.Session()
    response = session.post(HOST_URL + '?Login', data=payload)

    return session, response


def get_database_list(arg_session):
    """
    Summary:
        データベース一覧を取得
    Args:
        arg_session :ログイン済みセッション
    Returns:
        (なし)
    """
    # データベース一覧を取得
    api_endpoint = HOST_URL + '/api/data/'
    data_response = arg_session.get(api_endpoint)

    # 応答からDBタイトルを取得
    if data_response.status_code == 200:
        data_list = data_response.json()
        # レコードがなくなるまでループ
        for record in data_list:
            print(record.get('@title'))
    else:
        print('Access failed:', data_response.status_code)


def main():
    # セッション認証を行う
    session, response = create_session()

    # レスポンスコードから成否を判定
    if response.status_code == 200:
        get_database_list(session)
    else:
        print('Login failed:', response.status_code)


if __name__ == '__main__':
    main()

ビュー一覧の取得

 指定したデータベースのビュー一覧を取得します。データベースプロパティのDominoデータサービスを許可の有効にすると隠しビューを含めた全てのビューが取得できます。

"""
Overview:
    ビュー一覧の取得

"""
import requests

# 定数宣言
HOST_URL = 'https://www.hogehoge.com/'
DB_PATH = 'hoge/hoge.nsf'
USER_NAME = '(任意)'
USER_PW = '(任意)'


def create_session():
    """
    Summary:
        セッション認証を行い、セッションとレスポンスを返す
    Args:
        (なし)
    Returns:
        session     :セッション
        response    :レスポンス
    """
    # ログインペイロードの作成
    payload = {
        'username': USER_NAME,
        'password': USER_PW
    }

    # ログインリクエストを送信してセッションを確立
    session = requests.Session()
    response = session.post(HOST_URL + '?Login', data=payload)

    return session, response


def get_view_list(arg_session):
    """
    Summary:
        ビュー一覧を取得
    Args:
        arg_session :ログイン済みセッション
    Returns:
        (なし)
    """
    # ビュー一覧を取得
    api_endpoint = HOST_URL + DB_PATH + '/api/data/collections/'
    data_response = arg_session.get(api_endpoint)

    # 応答からビュータイトル,UNIDを取得
    if data_response.status_code == 200:
        data_list = data_response.json()
        # レコードがなくなるまでループ
        for record in data_list:
            print(record.get('@title'), record.get('@unid'))
    else:
        print('Access failed:', data_response.status_code)


def main():
    # セッション認証を行う
    session, response = create_session()

    # レスポンスコードから成否を判定
    if response.status_code == 200:
        get_view_list(session)
    else:
        print('Login failed:', response.status_code)


if __name__ == '__main__':
    main()

ビューエントリー一覧の取得

 ビューエントリーの取得では、ビューの指定を「ビュー名」と「UNID」のどちらでも指定できます。UNIDを知りたい場合は、Designerのビュープロパティで確認するか?先ほど行ったビュー一覧の取得で知ることができます。

"""
Overview:
    ビューエントリの取得(すべての文書)

"""
import requests

# 定数宣言
HOST_URL = 'https://www.hogehoge.com/'
DB_PATH = 'hoge/hoge.nsf'
VW_NAME = '(ビュー名)'
VW_UNID = '(ビューのUNID)'
USER_NAME = '(任意)'
USER_PW = '(任意)'


def create_session():
    """
    Summary:
        セッション認証を行い、セッションとレスポンスを返す
    Args:
        (なし)
    Returns:
        session     :セッション
        response    :レスポンス
    """
    # ログインペイロードの作成
    payload = {
        'username': USER_NAME,
        'password': USER_PW
    }

    # ログインリクエストを送信してセッションを確立
    session = requests.Session()
    response = session.post(HOST_URL + '?Login', data=payload)

    return session, response


def get_view_entries(arg_session):
    """
    Summary:
        ビューエントリー一覧を取得
    Args:
        arg_session :ログイン済みセッション
    Returns:
        (なし)
    """
    # ビューエントリー一覧を取得
    api_endpoint = HOST_URL + DB_PATH + \
        '/api/data/collections/name/' + VW_NAME  # ビュー名指定
#    api_endpoint = HOST_URL + DB_PATH + \
#        '/api/data/collections/unid/' + VW_UNID  # UNID指定

    data_response = arg_session.get(api_endpoint)

    # 応答から氏名、UNIDを取得
    if data_response.status_code == 200:
        data_list = data_response.json()
        # レコードがなくなるまでループ
        for record in data_list:
            print(record.get('Field02'), record.get('@unid'))
    else:
        print('Access failed:', data_response.status_code)


def main():
    # セッション認証を行う
    session, response = create_session()

    # レスポンスコードから成否を判定
    if response.status_code == 200:
        get_view_entries(session)
    else:
        print('Login failed:', response.status_code)


if __name__ == '__main__':
    main()

ソートされたビューから文書を取得

 第1ソート列にキーを指定して対象文書を取得します。

"""
Overview:
    ビューエントリの取得(キーを指定して一つの文書を取得)

"""
import requests

# 定数宣言
HOST_URL = 'https://www.hogehoge.com/'
DB_PATH = 'hoge/hoge.nsf'
VW_NAME = '(ビュー名)'
VW_UNID = '(ビューのUNID)'
USER_NAME = '(任意)'
USER_PW = '(任意)'


def create_session():
    """
    Summary:
        セッション認証を行い、セッションとレスポンスを返す
    Args:
        (なし)
    Returns:
        session     :セッション
        response    :レスポンス
    """
    # ログインペイロードの作成
    payload = {
        'username': USER_NAME,
        'password': USER_PW
    }

    # ログインリクエストを送信してセッションを確立
    session = requests.Session()
    response = session.post(HOST_URL + '?Login', data=payload)

    return session, response


def get_view_entry(arg_session, arg_search_key):
    """
    Summary:
        第一ソート列をキーに文書を取得
    Args:
        arg_session :ログイン済みセッション
        arg_search_key :ビューの検索キー(第1ソート列)
    Returns:
        (なし)
    """

    # 第一ソート列をキーに文書を取得
    api_endpoint = HOST_URL + DB_PATH + \
        '/api/data/collections/name/' + VW_NAME + '?search=' + arg_search_key  # ビュー名指定
#    api_endpoint = HOST_URL + DB_PATH + \
#        '/api/data/collections/unid/' + VW_UNID + '?search=' + arg_search_key  # UNID指定

    data_response = arg_session.get(api_endpoint)

    # 応答から氏名、UNIDを取得
    if data_response.status_code == 200:
        data_list = data_response.json()
        print(data_list[0]['Field02'], data_list[0]['@unid'])
    else:
        print('Access failed:', data_response.status_code)


def main():
    # セッション認証を行う
    session, response = create_session()

    # レスポンスコードから成否を判定
    if response.status_code == 200:
        search_key = '14'               # 検索キー
        get_view_entry(session, search_key)
    else:
        print('Login failed:', response.status_code)


if __name__ == '__main__':
    main()

動かない?場合の確認

 今回のソースではレスポンスが200以外だった場合にエラーコードを出すようにしています。動かない場合には下記のプロパティを確認して下さい。

次回予告

 Pythonを使ったDomino Data Access(RESTAPI)は予想以上に簡単だったのではないでしょうか?次回は文書関係のサンプルコードを紹介します。