在我当前的项目中,我有一个drupal后端,它为我的前端公开了休息服务。对我的后端的某些调用并不真正喜欢对URL实体进行编码。
所以我的问题是:如何禁用某些参数的URL编码?
例:
我需要在不同的搜索字词之间用“ +”号来调用我的后端。像这样:
http://backend.com/someservice/search/?terms=search+terms+here
但是有角度,设置像这样:
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}); };
调用以下网址:
http://backend.com/someservice/search/?terms=search%2Bterms%2Bhere
有什么建议?谢谢!
更新:使用 Angular 1.4中新的httpParamSerializer,您可以编写自己的paramSerializer并设置$httpProvider.defaults.paramSerializer。
$httpProvider.defaults.paramSerializer
以下内容仅适用于AngularJS 1.3(及更低版本)。
不更改AngularJS的来源是不可能的。
这是通过$ http完成的:
https://github.com/angular/angular.js/tree/v1.3.0-rc.5/src/ng/http.js#L1057
function buildUrl(url, params) { if (!params) return url; var parts = []; forEachSorted(params, function(value, key) { if (value === null || isUndefined(value)) return; if (!isArray(value)) value = [value]; forEach(value, function(v) { if (isObject(v)) { v = toJson(v); } parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(v)); }); }); if(parts.length > 0) { url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&'); } return url; }
encodeUriQuery使用标准encodeUriComponent(MDN),该标准将’+’替换为’%2B’
encodeUriQuery
encodeUriComponent
太糟糕了,您不能覆盖encodeUriQuery它,因为它是角度函数内部的局部变量。
因此,我看到的唯一选择是覆盖window.encodeURIComponent。我已经在$ http拦截器中做到了,以最大程度地减少影响。请注意,仅在响应返回时才放回原始功能,因此在您的请求正在进行时,此更改是全局(!!)。因此,请确保测试这是否不会破坏应用程序中的其他内容。
window.encodeURIComponent
app.config(function($httpProvider) { $httpProvider.interceptors.push(function($q) { var realEncodeURIComponent = window.encodeURIComponent; return { 'request': function(config) { window.encodeURIComponent = function(input) { return realEncodeURIComponent(input).split("%2B").join("+"); }; return config || $q.when(config); }, 'response': function(config) { window.encodeURIComponent = realEncodeURIComponent; return config || $q.when(config); } }; }); });