概要
sample_param=hoge_flag:true;foo_flag:true
上記の形で指定してパラメータをクエリに付与したく、
pythonコード上で
sample_param=hoge_flag:true%3bfoo_flag:true
と記載しました(%3b
はセミコロン;
を表す)。
しかし、AWS上でいざデバッグ結果を見ると
sample_param=hoge_flag%3Atrue%253bfoo_flag%3Atrue
という結果で処理されてしまっていることがわかりました。
原因と解決方法を紹介します。
原因
%3b
が%253bs
になっていたのはURLエンコードが二重に適用されてしまっていたため、でした。
%3b
は URL エンコードされたセミコロン (;
) を表しますが、
%253b
は %3b
をさらに URL エンコードしたものです。
なぜ二重エンコードが発生してしまったのでしょうか。
それは、コード上で
sample_param=hoge_flag%3Atrue%3bfoo_flag%3Atrue
と設定した後に、pythonのリクエストライブラリ(私の場合はrequests
)が再度エンコードしてしまっていたため、と考えられます。
既にエンコードした値を与えてしまったので、自動でさらにエンコードされてしまったのですね。
解決方法
リクエストライブラリで使う値をエンコードせずにそのまま設定し、ライブラリに任せる形にしたら、二重エンコードがなくなりました。
つまり、以下のようにセミコロンをそのまま使用します。
sample_param=hoge_flag:true;foo_flag:true
これで、クエリパラメータ上では「%3b
」で表示されることを確認できました。
ライブラリにエンコードを任せるのが良いのですね。
(参考)
requests
モジュールでは、標準ライブラリのurllib.parse.urlencode
などを使って自動的にエンコードを実施しているようです。