Python でメッセージ開始イベント (HTTP) にアクセスする

前回の記事では curl コマンドを用いて Questetra BPM Suite のメッセージ開始イベント (HTTP) にアクセスし、プロセスを新規開始しました。今回は Python 3 で同じ処理をするコード例を紹介します。この記事では、HTTP リクエストの送信には Requests パッケージを用います。インストールしていない場合はインストールをお願いします。

ワークフローアプリは前回の curl 編と同じものを使用します。もし作成していない場合は、準備編と curl 編の「さまざまなデータを送信する > アプリの設定」を参照しながら、アプリを作成・リリースしておいてください。

まず、件名だけを入力した状態でプロセスを新規開始しましょう。サンプルコードは以下の通りです。


import requests

if __name__ == '__main__':
    # API エンドポイント
    url = 'https://example.questetra.net/System/Event/MessageStart/{processModelInfoId}/{nodeNumber}/start'

    params = { # 辞書型にパラメータと、それに渡す値を格納
        'key' : {APIキー},
        'title' : 'テスト',
    }

    try:
        r = requests.post(url, data=params) # POST 送信
        r.raise_for_status()
        print('Status Code: {0}'.format(r.status_code))
        print(r.text)
    except requests.exceptions.HTTPError as e: # HTTP エラーをキャッチ
        print('Error')
        print('Status Code: {0}'.format(r.status_code))
        print(r.text)
    except requests.exceptions.Timeout as e: # タイムアウトをキャッチ
        print('Timeout')
メッセージ開始イベント (HTTP) の API へ文字データを送信する場合、文字コードは UTF-8 を使用する必要があります。ただし、Python 3 はデフォルトで UTF-8 を使用するため、文字コードに関する設定は必要ありません。

このスクリプトを実行することで、件名が「テスト」のプロセスを新規開始できます。他のパラメータにも値を渡したい場合、params に要素を追加してください。パラメータ名が key、渡す値が value です。ファイル型パラメータ以外では、例えば次のようになります。


params = {
    'key' : {APIキー},
    'title' : 'テスト',
    'q_str' : 'プロセス開始テストです',
    'q_float' : 1.23,
    'q_selects' : 'false',
    'q_date' : '2018-04-01',
    'q_datetime' : '2018-04-01 12:34',
    'q_email' : 'questetra+Canarias@gmail.com',
    'q_group' : '10 管理部',
}

curl 編と同じく、ファイル型パラメータへのデータ送信は少し手順が違います。


...
params = { # ファイル型以外のパラメータ
    'key' : {APIキー},
    'title' : 'テスト',
}

import mimetypes # MIMEタイプ判別のため

files = [ # ファイル型パラメータ
        # (パラメータ名, (ファイル名, ファイルオブジェクト, MIMEタイプ))
        ('q_file', ('ques-kun-01.png', open('./ques-kun-01.png', 'rb'), mimetypes.guess_type('./ques-kun-01.png'))),
]

try:
    r = requests.post(url, data=params, files=files) # POST 送信

...

ファイル型とそれ以外のパラメータで、格納先を分ける必要があります。その上で requests.post() メソッドの data パラメータと files パラメータにそれぞれを渡してください。また、ファイルオープンはバイナリモードで行ってください。curl コマンドの場合と違って、送信する際のデータ形式を気にする必要はありません。Requests ライブラリによって、文字列のみの送信の場合は application/x-www-form-urlencoded 形式、ファイルを含む場合には multipart/form-data 形式に自動的に変換されます。

最後に、すべてのデータ項目にデータを入力してプロセスを開始するコードを例として挙げておきます。


import requests
import mimetypes

if __name__ == '__main__':
    # API エンドポイント
    url = 'https://example.questetra.net/System/Event/MessageStart/{processModelInfoId}/{nodeNumber}/start'


    params = { # ファイル型以外のパラメータ
        'key' : {APIキー},
        'title' : 'テスト',
        'q_str' : 'プロセス開始テストです',
        'q_float' : 1.23,
        'q_selects' : 'false',
        'q_date' : '2018-04-01',
        'q_datetime' : '2018-04-01 12:34',
        'q_email' : questetra+Canarias@gmail.com,
        'q_group' : '10 管理部',
    }

    files = [ # ファイル型パラメータ
        # ファイルの複数送信もできます
        ('q_file', ('ques-kun-01.png', open('./ques-kun-01.png', 'rb'), mimetypes.guess_type('./ques-kun-01.png'))),
        ('q_file', ('ques-kun-02.png', open('./ques-kun-02.png', 'rb'), mimetypes.guess_type('./ques-kun-02.png'))),
    ]

    try:
        r = requests.post(url, data=params, files=files) # POST 送信
        r.raise_for_status()
        print('Headers: ')
        print(r.request.headers)
        print('Status Code: {0}'.format(r.status_code))
        print(r.text)
    except requests.exceptions.HTTPError as e: # HTTP エラーをキャッチ
        print('Error')
        print('Status Code: {0}'.format(r.status_code))
        print(r.text)
    except requests.exceptions.Timeout as e: # タイムアウトをキャッチ
        print('Timeout')

このように Python では、パラメータと渡す値の組を用意すれば簡単にプロセスを新規開始できます。業務で用いるプログラムの中で API を利用すれば、状況に応じて自動でパラメータに渡す値を決定し、プロセスを開始することもできるでしょう。業務の自動化への手法の一つとして、ぜひメッセージ開始イベント (HTTP) の活用を検討してみましょう!

次: Questetra BPM Suite の外からプロセスを開始する(エラー対処編・準備中)