
- Questetra BPM Suite の外からプロセスを開始する(準備編)
- Questetra BPM Suite の外からプロセスを開始する(curl編)
- Questetra BPM Suite の外からプロセスを開始する(Python編)
- Questetra BPM Suite の外からプロセスを開始する(エラー対処編)
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 データが表示されます。
エラーメッセージ別トラブルシューティング
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 文字以上にしてください。」など、対処法はエラーメッセージにより具体的に指示されます。具体的なエラーメッセージが返されたら、メッセージの内容を見て、データ項目の設定を確認しましょう。
ピンバック: メッセージ開始イベント(HTTP) – Questetra Support