はじめに
Power Autoamteの「HTTP」コネクタを使って、GET要求をする際に、クエリに全角文字を含めるとエラーになる問題が発生した。
色々纏めた最中に気が付いたこと、これは環境による一時的な不具合であることが分かった…
いわゆる、ブラウザ再起動やキャッシュクリアで改善する内容だ。がせっかく記事を作ってしまったので残しはするが、結論は一番下を見てもらい、そういうエラーメッセージも出るんだねと思ってもらえれば。
アクセス例
・Kintoneレコードをフィールド「顧客名(client_name)」をクエリの条件として取得するREST APIを投げることを考える。
方法1. GET要求 + URLにクエリを結合する
(1 – i) URLに全角文字を使用しない場合
フロー設定
実行結果
OK:問題なく、顧客名が「AAA」のレコードのみを取得することができる。
(1 – ⅱ) URLに全角文字を使用した場合(エンコードなし)
フロー設定
実行結果
NG:Microsoft側のエラーメッセージに切り替わった。
URIは一意にしてねというエラーが表示され、実行に失敗した。
{
"title": "Proxy execute request error",
"status": 400,
"detail": "ms-plex-targetServiceUrl header must be a valid Absolute Uri.",
"instance": "/extension/proxy",
"serviceRequestId": "***",
"exceptionSource": "InvalidProxyExecuteRequestException"
}
(1 – ⅲ) URLに全角文字を使用した場合(エンコードあり)
エンコードしていないことが原因かと思い、クエリをURIエンコードしてみる。
フロー設定
実行結果
(1 – ⅱ)と同じエラーが発生(Proxy execute request error
)
方法2. GET要求 + クエリ欄にクエリを指定する
(2 – ⅰ)クエリ欄に全角文字を使用した場合(エンコードなし)
(1 – ⅱ)と同じエラーが発生(Proxy execute request error
)
(2 – ⅱ)クエリ欄に全角文字を使用した場合(エンコードあり)
フロー設定
実行結果
Kintone側の構文エラー「クエリの書き方が間違っているよ」が発生。
{
"code": "CB_VA01",
"id": "******",
"message": "Missing or invalid input.",
"errors": {
"query": {
"messages": [
"unsupported query format"
]
}
}
}
方法3. GET要求 + bodyにクエリを指定する
GET要求でBodyを指定しちゃだめだよ、と怒られる。
実行結果
BadRequest. The provided 'Http' action inputs are not valid.
A request body must not be included for 'GET' requests.
これはMicrosoft側で出しているエラーではあるが、Microsoftのルールに違反したからではなく、HTTP通信の規約に違反しているため。
以下に「GET要求をする場合は、コンテンツ(Bodyでいいのか?)を作成しないでね」という記述がある。
A client SHOULD NOT generate content in a GET request.
A payload within a GET request has no defined semantics,
and some implementations might reject the request.
方法4. Kintone限定:POST + X-HTTP-Method-Override
Kintoneでは、POST要求をしつつも、Kintoneの内部ではGET要求として扱ってくれる仕組みがある。
「X-HTTP-Method-Override : GET
」とするとそれができる。
本来は、URLの文字長制限を回避するためなどに設けられた機能のようだ。
参照サイト:kintone REST APIの共通仕様 – cybozu developer network
実行するAPIのHTTPメソッド(GET/POST/PUT/DELETEのいずれか)を大文字で指定します。
このヘッダーにHTTPメソッドを指定してPOSTリクエストを送信すると、指定したHTTPメソッドに対応するAPIが実行されます。
フロー設定
実行結果
問題なくレコードを取得できた。
まとめ
- (1 – ⅱ) GET + URLにクエリを結合 + エンコードなし ⇒ MSエラー
- (1 – ⅲ) GET + URLにクエリを結合 + エンコードあり ⇒ MSエラー
- (2 – ⅰ)GET + クエリ欄に指定 + エンコードなし ⇒ MSエラー
- (2 – ⅱ)GET + クエリ欄に指定 + エンコードあり ⇒ Kintone構文エラー
- (3)GET + bodyに指定 ⇒ HTTP通信の規約上NG
- (4)POST + X-HTTP-Method-Override(GET) ⇒ OK
まとめ(追記)
こちらが正しいまとめ。
MSによるエラー(Proxy execute request error
)は一時的なものであり、エンコードなしでのクエリでも正常に動作することを後日確認した。
ただし、今回のようなエラーが発生することを想定して、あらかじめ(4)の方法で実装してもいいのかもしれない。
- (1 – ⅱ) GET + URLにクエリを結合 + エンコードなし ⇒ OK
- (2 – ⅰ)GET + クエリ欄に指定 + エンコードなし ⇒ OK
- (4)POST + X-HTTP-Method-Override(GET) ⇒ OK