完全なコードを表示していただきありがとうございます。問題は、コンテンツを$body
URL パラメータとして渡していることです。そのため、HTTP プロトコルでは、それらを適切に渡すためにさまざまな文字をエスケープする必要があります。
モジュールを使用してこれを実現でき、URI::Escape
125 行目以降の行で行っているサニタイズを行う必要がなくなります# clean the body
。
このプログラムは、特定したすべての問題文字を含む文字列を使用し、モジュールを使用して翻訳します。Curl の URL に追加する前uri_escape
に のコンテンツを使用すると、すべてが機能するはずです。$body
use strict;
use warnings;
use URI::Escape 'uri_escape';
my $body = '%localappdata% â & ';
print uri_escape $body;
出力
%25localappdata%25%20%E2%20%26%20
アップデート
一般的に URL を操作するには、URL のパスとクエリ部分の両方で必要なすべてのエスケープを行うURI
モジュールを使用するのが最善です。
$curl->setopt
以下のプログラムは、このメソッドを使用して渡す必要がある URL を生成する方法を示しています。
use strict;
use warnings;
use URI;
my $url = URI->new('https://this/is/the/url');
my $body = '%localappdata% â & ';
$url->query_form(body => $body);
print $url, "\n";
出力
https://this/is/the/url?body=%25localappdata%25+%E2+%26+
(この方法では空白文字+
の代わりに使用することに注意してください%20
。どちらも URL のクエリ部分で受け入れられます。)
この URL は、次のように記述して Curl オプションとして直接設定できます。
$curl->setopt(CURLOPT_URL, $url);