2011-01-25 4 views
1

J'ai un api de repos qui est utilisé par JSONP en raison de problèmes inter-domaines, j'ai implémété un errorlogger qui attrape toutes les erreurs qui se produisent sur la page et les messages au serveur l'uri pour l'enregistreur d'erreur est quelque chose comme:Rest API: passer le window.location.href dans le REST uri

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

la variable d'emplacement est problématique, comment puis-je passer le window.location.href dans le uri?

J'ai essayé escape, encodeuri, encodeuricomponent dois-je le base64? grâce

Répondre

0

séquence Échapper pour les URI est défini dans section 2.4.1 de RFC2396 (Uniform Resource Identifier):

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" 

Ce RFC définit également les caractères réservés pour le composant path dans section 3.3:

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

Ainsi vous devez utiliser encodeURIComponent() car escape() a été deprecated et encodeURI()does not escape all reserved characters qui doivent être échappées selon l'extrait RFC ci-dessus.

L'exemple ci-dessous montre que seul encodeURIComponent() échappe des barres obliques correctement (ce sont les personnages qui cause la plus probable que les problèmes que vous rencontrez):

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

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

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

Cependant s'il vous plaît noter que, si possible, vous devriez utiliser POST au lieu de GET. C'est la méthode correcte à utiliser dans REST (et en général), car vous envoyez des données du client au serveur (POST) plutôt que de les obtenir du serveur (GET). L'utilisation de POST vous permettra également d'éviter un problème supplémentaire. Comme la longueur des URI est limitée dans les serveurs Web courants, vous rencontrerez tôt ou tard une requête avec un URI très long qui sera soit tronqué, soit une erreur. Passer à POST vous permettra de garder l'URI propre et de garder les données dans le corps du message au lieu de l'URI. Voir answers to this question pour plus de détails sur les limites de longueur d'URI.

+0

Merci pour la réponse détaillée, je vais essayer de trouver quels sont les caractères problématiques et peut-être simplement les supprimer. je ne peux pas passer à poster dur comme je travaille dans JSONP – Amnon

+0

Oh, je vois (JSONP). Supprimer les caractères est bien sûr une bonne option si vous n'avez pas besoin de reconstruire l'URI plus tard. Toutefois, si votre API le permet, vous pouvez envisager de déplacer les paramètres du composant path vers la chaîne de requête, ce qui vous aidera à éviter la limite de longueur de l'URI. Nous l'avons rencontré sur un projet, ce n'était pas du tout une bonne expérience: -/ Notez que vous aurez toujours besoin de 'encoderComponent()' pour la chaîne de requête alternative, en tant que {location} valeurs qui ont leurs propres paramètres de requête pourrait casser la demande (pour la même raison que maintenant). – MicE

+0

merci pour l'astuce concernant la chaîne de requête, j'ai fini par utiliser base64 pour le paramètre de localisation que je ne voulais pas commencer avec des caractères spécifiques. – Amnon