[power automate]HTTPコネクタのクエリに全角文字を含めると動作しない不具合

はじめに

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でいいのか?)を作成しないでね」という記述がある。

RFC 9110 – HTTP Semantics

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