発生しているのは正しい動作であり、URL エンコーディングと呼ばれます。HTTP リクエストは、特定の標準に準拠する必要があります。最初の行は常に、スペースで区切られた 3 つの部分で構成されます。
- メソッド(GET、POSTなど)
- パス (つまり、/api/lol/na/v1.4/summoner/by-name/the%20man)
- HTTP バージョン (HTTP/1.1、HTTP/1.0 など)
これは通常、質問の範囲を超えているため、当分の間除外する HTTP ヘッダーが続きます (興味がある場合は、このhttps://www.rfc-editor.org/rfc/rfc7230をお読みください)。したがって、通常のリクエストは次のようになります。
GET /api/lol/na/v1.4/summoner/by-name/the%20man HTTP/1.1
Host: na.api.pvp.net
User-Agent: Mozilla
...
元の質問に関して、ライブラリがスペースを URL エンコードする理由は%20
、リクエスト行にスペース文字を含めることができないためです。そうしないと、次man
のように HTTP バージョンの行が置き換えられるため、ほとんどの HTTP メッセージ パーサーが破棄されます。
GET /api/lol/na/v1.4/summoner/by-name/the man HTTP/1.1
Host: na.api.pvp.net
User-Agent: Mozilla
...
man
ほとんどの場合、サーバーは HTTP バージョンが何を指しているのか理解できないため、400 の不適切な要求応答を返します。ただし、心配する必要はありません。ほとんどのサーバー側アプリケーション/フレームワークは、HTTP 要求のデータを処理する前に、%20
またはをスペースに自動的にデコードします。+
そのため、URL が変わっているように見えても、サーバー側では として処理されthe man
ます。
最後に、もう 1 つ注意事項があります。String.replace()
メッセージの URL デコードにを使用しないでください。代わりに、文字列のデコードとエンコードにそれぞれ decodeURI() と encodeURI() を使用する必要があります。例えば:
var user = getUrlVars()["username"].replace("+", " ");
になる
var user = decodeURI(getUrlVars()["username"]);
これにより、特殊文字 (/
として URL エンコードされるようなもの%2f
) を含むユーザー名もおそらくデコードされます。お役に立てれば!