0

League of Legends API を使用して、特定のユーザーのデータをリクエストしようとしています。ラインを使っています

    var user = getUrlVars()["username"].replace("+", " ");

ユーザー名を保存します。ただし、そのユーザー名で XMLHttpRequest を実行すると、スペースの代わりに %20 が挿入されます。

y.open("GET", "https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/"+user, false);

編集:名前にスペースが含まれていないユーザーでこのコードを実行すると機能しますが、名前にスペースが含まれていると、ユーザーが未定義であると表示されます。

たとえば、ユーザー「the man」を探していた場合、get at を実行します。

https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/the%20man

しかし、正しいリクエスト URL は

https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/the man
4

3 に答える 3

3

URL を作成するときは、encodeURIComponentすべての特殊文字を適切にエンコードするために使用する必要があります。

y.open("GET", "https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/"+encodeURIComponent(user), false);
于 2015-05-22T01:38:12.760 に答える
1

実際、Riot 側のサモナー名には「スペース」はありません。そう:

https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/the man

なる:

https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/theman

これを見てください: https://developer.riotgames.com/discussion/community-discussion/show/jomoRum7

+ がどのように処理されるかはわかりません (実際、名前に + を含めることはできないと思います)。スペースを削除するだけです。

「おかしな」キャラクターの場合は、そのおかしなキャラクターを含めてリクエストするだけで、Riot はそれを問題なく返しました。

https://euw.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/Trøyer?api_key=<insert your own>

に自動修正されます

https://euw.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/Tr%C3%B8yer?api_key=<insert your own>

通常、それをデコードする必要さえありません。(私はそれを取得する言語として JS を使用しました。他の何かを使用すると、結果にデコードされた値が必要になる場合があります)

于 2015-06-17T11:08:30.637 に答える
0

発生しているのは正しい動作であり、URL エンコーディングと呼ばれます。HTTP リクエストは、特定の標準に準拠する必要があります。最初の行は常に、スペースで区切られた 3 つの部分で構成されます。

  1. メソッド(GET、POSTなど)
  2. パス (つまり、/api/lol/na/v1.4/summoner/by-name/the%20man)
  3. 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) を含むユーザー名もおそらくデコードされます。お役に立てれば!

于 2015-05-22T01:46:10.053 に答える