0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】`%3b`が`%253bs`に...なぜ?原因は「URL エンコードが二重に適用」されてしまっていたためだった

Posted at

概要

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などを使って自動的にエンコードを実施しているようです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?