2011-01-25 6 views
1

クロスドメインの問題のためにトラフJSONPで使用される残りのAPIがあります。ページと投稿で発生するすべてのエラーを検出するエラーログを実装しました。残りのAPI:RESTでwindow.location.hrefを渡すurier

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

場所変数iがURIにwindow.location.hrefを渡すことができますどのように、問題がある:それは、エラーロガーのサーバー URIにようなものでしょうか?

私はエスケープしようとしました、encodeuri、encodeuricomponent私はそれをbase64する必要がありますか? URIのシーケンスをエスケープ おかげ

答えて

0

はRFC2396(ユニフォームリソース識別子)のsection 2.4.1で定義されている:だから

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

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はまたsection 3.3pathコンポーネントの予約文字を定義しますescape()deprecatedencodeURI()であるため、encodeURIComponent()を使用する必要があります上記のRFCの抜粋に従ってエスケープする必要があります。

次の例では、唯一のencodeURIComponent()が(これらはほとんどの場合、あなたが直面している問題を起こす文字である)適切にスラッシュをエスケープしていることを示しています

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

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

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

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

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

+0

詳細な回答をいただきありがとうございます。問題のある文字は何かを見つけようとし、たぶんそれらを削除します。私はJSONPで働いているので難しい投稿に移動することはできません – Amnon

+0

ああ、私は(JSONP)を参照してください。後でURIを再構成する必要がない場合は、文字を削除することはもちろん便利です。ただし、APIで許可されている場合は、パスのコンポーネントからクエリ文字列にパラメータを移動することを検討してください。これは、URIの長さの制限を避けるのに役立ちます。 -/ クエリ文字列の代わりに独自のクエリパラメータを持つ{location}値として 'encodeURIComponent()'が必要であることに注意してください要求が破棄される可能性があります(現在と同じ理由により)。 – MicE

+0

クエリ文字列に関してヒントをいただきありがとうございます。特定の文字で開始したくないため、locationパラメータにbase64を使用しました。 – Amnon

関連する問題