API からエラーが返ってきた!

メッセージ開始イベント (HTTP) の API を触っていると、きっとこんな事態に遭遇すると思います。あるいは「よくわからないけれど動かない」ということもあるかもしれません。この記事ではメッセージ開始イベント (HTTP) の API が返すエラーについて解説します。

エラーの調べ方

「メッセージ開始イベント (HTTP) にアクセスしたが、プロセスが開始されない」という場合には、HTTP ステータスコードと API が返すエラーメッセージを確認しましょう。HTTP ステータスコードから大まかにどこでエラーが起きているかがわかり、クライアント(ユーザ)側に不手際がある場合は API のエラーメッセージが修正点を指摘してくれます。

HTTP ステータスコードを見る

curl コマンドの場合

-i オプションを利用すると、メッセージ開始イベント (HTTP) が返したレスポンスヘッダを表示できます。

$ curl -i https://example.questetra.net/... 

例えば、レスポンスヘッダは次のように返ってきます。

HTTP/1.1 200 200
Date: Wed, 16 Jan 2019 05:46:50 GMT
Server: Apache
Pragma: no-cache
Cache-Control: no-store
Expires: Thu, 01 Jan 1970 00:00:00 GMT
X-Q-Access-ID: {サーバ名(上の例であれば "example")}
Content-Type: text/plain;charset=UTF-8
Content-Language: ja
Content-Length: 3
Vary: Accept-Encoding
P3P: CP="CAO PSA OUR"

この場合、HTTP ステータスコードは 200 “OK” なので、データ送信は成功しています。400番台・500番台がエラーを示した番号です。例えば次の場合は HTTP ステータスコード 400 “Bad Request” がメッセージ開始イベント (HTTP) API から返ってきています。

HTTP/1.1 400 400
Date: Fri, 18 Jan 2019 07:49:58 GMT
Server: Apache
Pragma: no-cache
Cache-Control: no-store
Expires: Thu, 01 Jan 1970 00:00:00 GMT
X-Q-Access-ID: shichijo-onmae-134
Content-Disposition: inline
Content-Type: text/xml;charset=UTF-8
Content-Language: ja
P3P: CP="CAO PSA OUR"
Connection: close
Transfer-Encoding: chunked

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><message-start-event-errors><error><key>q_selects</key><detail>選択は 2 個以上にしてください。</detail></error></message-start-event-errors>

各 HTTP ステータスコードの意味については「主な HTTP ステータスコード一覧」を参照してください。

Python 3(Request パッケージ利用)の場合

Python 編で示したサンプルコードは、HTTP ステータスコードを標準出力するようになっています。

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')

このように、requests.post() が返す Response オブジェクトはステータスコードをインスタンス変数 status_code に保持しています。サンプルコードでは、HTTP エラーがない場合は次のように標準出力されます。

Headers: 
{'User-Agent': 'python-requests/2.21.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '72753', 'Content-Type': 'multipart/form-data; boundary=bf3a1ec648ccb798d9a9c6a914d77c81'}
Status Code: 200
151

しかし、HTTP エラーが出ている場合には、Response.raise_for_status() を実行した際に HTTPError 例外が送出されます。

Error
Status Code: 400
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><message-start-event-errors><error><key>key</key><detail>Invalid API Key</detail></error></message-start-event-errors>

この場合は HTTP ステータスコード 400 “Bad Request” がメッセージ開始イベント (HTTP) API から返されています。各 HTTP ステータスコードの意味については、次の「主な HTTP ステータスコード一覧」を参照してください。

主な HTTP ステータスコード一覧

ステータスコード 内容
200 “OK”。リクエストはメッセージ開始イベント (HTTP) に正しく受理されました。開始したプロセスの ID がプレーンテキストで返されます。
400 “Bad Request”。リクエストが正しくありません。後述するレスポンスボディを確認して、送信するデータを修正してください。
403 “Forbidden”。アクセス権限がありません。使用している IP アドレスからのアクセスが許可されているか確認してください。アクセス許可設定はシステム設定の「IP アドレス制限」ページでできます。また、各メッセージ開始イベント (HTTP) の詳細ページで、そのイベントへのアクセスを許可されている IP アドレスを確認できます。
404 “Not Found”。URL が指定する先にリソースがありません。URL が間違っていないか確認してください。
500, 502, 503, 504など サーバ混雑・ダウンなど、サーバ側の問題でリクエストが処理できていません。しばらく待ってからもう一度送信してみてください。時間を空けても解決しない場合、サポートまでお問い合わせください。
大きなデータを送信した場合、HTTP ステータスコード 100 “Continue” が返ってくることがあります。これはデータ送信が継続中であることを示しており、この時点ではリクエストはまだ完了していません。データ送信が完了するとまた HTTP ステータスコードが返されるので、送信結果についてはそちらを確認してください。

エラーメッセージを見る

HTTP ステータスコードが 400 番を示している場合は、クライアント(ユーザ)が送信したデータに何らかの不備があります。メッセージ開始イベント (HTTP) API が返すエラーメッセージを確認して修正しましょう。エラーメッセージはレスポンスボディに格納されています。

curl コマンドの場合

curl コマンドの場合、レスポンスボディはデフォルトで標準出力されます。例えば HTTP ステータスコードの項で挙げた通り、次のような XML データが表示されます(見やすさのためにここでは適宜改行を入れています)。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message-start-event-errors>
<error>
<key>q_str</key>
<detail>文字数は 5 文字以上にしてください。</detail>
</error>
<error>
<key>q_selects</key>
<detail>選択は 2 個以上にしてください。</detail>
</error>
</message-start-event-errors>

<key> ~ </key> の間に書かれているのがエラーを返したパラメータ名、<detail> ~ </detail> の間に書かれているのがエラーの内容です。この場合、

  • “q_str”(文字型データ項目)から「文字数は 5 文字以上にしてください。」
  • “q_selects”(選択型データ項目)から「選択は 2 個以上にしてください。」

というエラーメッセージが返されています。

Python 3(Request パッケージ利用)の場合

レスポンスボディは Requests オブジェクトのインスタンス変数 text に格納されています。サンプルコードではこれを標準出力することで、curl コマンドの場合と同じく XML データが表示されます。

エラーメッセージ別トラブルシューティング

エラーは出なかったがプロセスが開始されなかったときは、HTTP ステータスコードを確認しましょう。各ステータスコードの意味については「主な HTTP ステータスコード一覧」を参照してください。
processModelInfold, nodeNumber – not found
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message-start-event-errors>
<error>
<key>processModelInfoId</key>
<detail>not found</detail>
</error>
</message-start-event-errors>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message-start-event-errors>
<error>
<key>nodeNumber</key>
<detail>not found</detail>
</error>
</message-start-event-errors>

指定したアプリ、またはノードが存在しません。processModelInfold の場合はアプリ、nodeNumberの場合はノードです。番号の指定が間違っていないか確認してください。

nodeNumber が not found を返した場合、processModelInfold が間違っているために別のアプリを参照してしまった結果、nodeNumber が not found を返す場合もあります。

nodeNumber – not start event (HTTP)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message-start-event-errors>
<error>
<key>nodeNumber</key>
<detail>not start event (HTTP)</detail>
</error>
</message-start-event-errors>

指定したノードはメッセージ開始イベントではありません。processModelInfold や nodeNumber の値が間違っていないか確認してください。

key – Invalid API key
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message-start-event-errors>
<error>
<key>key</key>
<detail>Invalid API Key</detail>
</error>
</message-start-event-errors>

API キーが無効です。API キーが間違っていないか確認してください。

その他

エラーメッセージには様々なパターンがあります。しかし、例えば文字型データ項目が返す「文字数は n 文字以上にしてください。」など、対処法はエラーメッセージにより具体的に指示されます。エラーメッセージが返されたら、メッセージの内容とデータ項目の設定を確認しましょう。

“Questetra BPM Suite の外からプロセスを開始する(エラー対処編)” への1件のコメント

  1. ピンバック: メッセージ開始イベント(HTTP) – Questetra Support

コメントは受け付けていません。