gpt4 book ai didi

javascript - AngularJS 资源 : how to disable url entity encoding

转载 作者:可可西里 更新时间:2023-11-01 01:42:11 24 4
gpt4 key购买 nike

在我当前的项目中,我有一个 drupal 后端,它为我的前端公开了休息服务。对我的后端的一些调用并不真正喜欢对 url 实体进行编码。

所以我的问题是:如何禁用某些参数的 URL 编码?

例子:

我需要在不同的搜索词之间用“+”号调用我的后端。像这样:

http://backend.com/someservice/search/?terms=search+terms+here

但是 Angular ,像这样设置:

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

有什么建议吗?谢谢!

最佳答案

更新:使用新的 httpParamSerializer在 Angular 1.4 中,您可以通过编写自己的 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,因为它是 Angular 函数内的局部变量。

所以我看到的唯一选择是覆盖 window.encodeURIComponent。我已经在 $http 拦截器中完成了它,以尽量减少影响。请注意,只有在响应返回时才会放回原始功能,因此在您的请求正在进行时,此更改是全局的(!!)。因此,请务必测试这是否不会破坏您的应用程序中的其他内容。

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);
}
};
});
});

关于javascript - AngularJS 资源 : how to disable url entity encoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22944932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com