Ressource AngularJS: comment désactiver le codage de l'entité url
Sur mon projet actuel, j'ai un drupal backend qui expose des services rest pour mon frontend.
Certains appels à mon backend n'aime pas vraiment url entités codé.
Donc ma question est: comment puis-je désactiver le codage d'URL de certains paramètres?
Exemple:
Je dois appeler mon backend avec un "+"-signe entre les différents termes de recherche. Comme:
http://backend.com/someservice/search/?terms=search+terms+here
Mais angulaire, le programme d'installation comme suit:
var resource = $resource(
backendUrl + '/views/:view', {},
{
'search': {params:{view:'searchposts'}, isArray:true}
}
);
//search posts for the given terms
this.searchPosts = function(terms, limit) {
resource.search({search:terms.join('+'), limit:limit});
};
Appelle l'url suivante:
http://backend.com/someservice/search/?terms=search%2Bterms%2Bhere
Des suggestions? Merci!
source d'informationauteur polyclick | 2014-04-08
Vous devez vous connecter pour publier un commentaire.
Mise à jour: avec la nouvelle httpParamSerializer dans Angulaire de la version 1.4, vous pouvez le faire en écrivant votre propre paramSerializer et réglage
$httpProvider.defaults.paramSerializer
.Ci-dessous s'applique uniquement à AngularJS 1.3 (et plus).
Il n'est pas possible sans changer la source d'AngularJS.
Ceci est fait par $http:
https://github.com/angular/angular.js/tree/v1.3.0-rc.5/src/ng/http.js#L1057
encodeUriQuery
utilise la normeencodeUriComponent
( MDN ), qui remplace le '+' à '%2B'Trop mauvais, vous ne pouvez pas écraser
encodeUriQuery
parce que c'est une variable locale à l'intérieur de l'angle de la fonction.Donc la seule option que je vois est de remplacer
window.encodeURIComponent
. Je l'ai fait dans un $http intercepteur à en minimiser l'impact. Notez que la fonction d'origine est seulement mis en arrière quand la réponse est de retour, de sorte que ce changement est global (!!) pendant que votre demande est en cours. Assurez-vous donc de tester si ce n'est pas de casser quelque chose d'autre dans votre application.AngularJS ne fonctionne que le encodeUriQuery méthode si vous passer vos params comme un objet supplémentaire. Si vous créez manuellement vos propres param string et enchaîner sur votre URL, puis Angulaire de ne pas le modifier.
Il est assez simple de convertir le paramètre objet vous-même, voici un exemple: Comment sérialiser un Objet dans une liste de paramètres?
Alors que habituellement, vous ne voulez pas le faire (puisque sur le côté serveur, vous pouvez décoder l'URI de la demande avec une URL de décoder la fonction pour récupérer vos plus signes) parfois nous avons envie de "casser" les règles.
Droit maintenant, je ne peux pas vraiment tester (il serait utile si vous pouvez créer un jsfiddle à un cas de test pour nous de jouer avec), mais vous devriez probablement prendre un coup d'oeil à la transformRequest fonction de l'objet de la ressource.
De la documentation:
Il ressemble à la
$resource
code est renvoyé à cette fonctionnalité dansRoute.prototype.setUrlParams
:Source
Et il semble que la
resourceFactory
fonction crée un fermeture le construit la route, de sorte que vous n'avez pas accès à ce changement.Ne vous avez spécifiquement besoin de cela pour être un objet de ressource? Si non, vous pouvez créer une plaine
$http
appel et une demande de transformation comme Antonio mentionné.