gpt4 book ai didi

angularjs - Angular 不对 url 中的分号字符进行编码

转载 作者:行者123 更新时间:2023-12-01 08:57:14 30 4
gpt4 key购买 nike

我们在 url 参数中需要一个编码的分号字符,但 angular 不编码这个字符。

我们使用的资源如下所示:

app.factory('TestResource', ['$resource', function ($resource) {
return $resource('http://somedomain.com');
}]);

app.run(['TestResource', function (TestResource) {
TestResource.query({
q: 'sin;sout'
});
}]);

这是我们得到的结果:
http://somedomain.com/?q=sin;sout

我们希望网址是:
http://somedomain.com/?q=sin%3Bsout

但是,如果我们在发送 % char 之前对参数进行预编码,则 get 编码如下:
http://somedomain.com/?q=sin%253Bsout

我们怎样才能得到想要的结果? ( http://somedomain.com/?q=sin%3Bsout)

最佳答案

Angular 使用自己的函数对 URL 进行编码。而且该函数不编码通常不需要编码的字符,如 /? . ;也是这样的人物。它用于矩阵 URI,例如所以Angular的行为其实是符合标准的,但是可以当这些字符按字面意思使用时,即没有特殊含义时,就会出现问题。这里似乎就是这种情况。

由于 URL 是在发送请求之前构建的,因此我们无能为力。但是有一个漏洞:只有参数被编码,而不是基本 URL。因此,任何解决方法都将涉及自己创建 URL 或至少一部分。

您可以添加一个拦截器,在 Angular 执行此操作之前将正确编码的参数添加到 URL。你甚至可以用这种方式完全替换 Angular 的行为。

更新:

我想到了另一个解决方案。 $http服务代表将实际请求发送到 $httpBackend接收已构建的 URL 的服务。使用装饰器可以替换 ;或编码不正确的 %253B%3B在发送请求之前:

app.config(function($provide) {
$provide.decorator('$httpBackend', function($delegate) {
return function(method, url, post, callback, headers, timeout, withCredentials, responseType) {
url = url.replace(';', '%3B');
$delegate(method, url, post, callback, headers, timeout, withCredentials, responseType);
};
})
});

关于angularjs - Angular 不对 url 中的分号字符进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26797964/

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