1

クロスドメインの問題のためにJSONPを介して使用されるRESTAPIがあります。ページで発生するすべてのエラーをキャッチし、サーバーに投稿するエラーロガーを実装しました。エラーロガーのuriは次のようになります。

user/{userId}/message/{errorMessage}/browser/{browser}/browserVer/{browserVer}/secure/{secure}/os/{os}/location/{location}"

場所変数に問題があります。URIでwindow.location.hrefを渡すにはどうすればよいですか?

私はescape、encodeuri、encodeuricomponentを試しましたが、base64にする必要がありますか?ありがとう

4

1 に答える 1

0

URIのエスケープシーケンスは、RFC2396(Uniform Resource Identifiers)のセクション2.4.1で定義されています。

An escaped octet is encoded as a character triplet, consisting of the
percent character "%" followed by the two hexadecimal digits
representing the octet code. For example, "%20" is the escaped
encoding for the US-ASCII space character.

   escaped     = "%" hex hex
   hex         = digit | "A" | "B" | "C" | "D" | "E" | "F" |
                         "a" | "b" | "c" | "d" | "e" | "f"

このRFCは、セクション3.3pathでコンポーネントの予約文字も定義しています。

Within a path segment, the characters "/", ";", "=", and "?" are reserved.

したがって、 encodeURIComponent()を使用する必要があります。これescape()は、非推奨であり、上記のRFCの抜粋に従ってエスケープする必要のあるencodeURI() すべての予約文字をエスケープするわけではないためです。

以下の例は、スラッシュを適切にエスケープしているだけであることを示していencodeURIComponent()ます(これらは、直面している問題を引き起こす可能性が最も高い文字です)。

>>> escape('//');
"//"

>>> encodeURI('//');
"//"

>>> encodeURIComponent('//');
"%2F%2F"

ただし、可能であれば、GETの代わりにPOSTを使用する必要があることに注意してください。これは、サーバーからデータを取得する(GET)のではなく、クライアントからサーバー(POST)にデータを送信するため、REST(および一般的に)で使用する正しい方法です。

POSTを使用すると、追加の問題を回避することもできます。一般的なWebサーバーではURIの長さが制限されているため、遅かれ早かれ、非常に長いURIのリクエストが発生し、トリミングされるか、エラーがスローされます。POSTに切り替えると、URIをクリーンに保ち、URIではなくメッセージの本文にデータを保持できるようになります。URIの長さ制限の詳細については、この質問への回答を参照してください。

于 2011-01-26T00:28:21.070 に答える