冒号未在资源参数中编码 URL

Colons not being URL encoded in resource parameters

我正在使用 Angular 的资源模块访问网络 API,但我遇到了问题,因为 API 使用 URI 作为主键。

每当我尝试调用此 API,将 URI 作为字符串参数传递时,我都会收到 400 Bad Request 错误。仔细检查后,Resource 转义了 URI 中的所有正斜杠,但没有转义开头的冒号。它在 URL 上执行 GET,看起来像这样:http://myserver/api/objects/http:%2F%2Fexample.comk%2FmyURI%2F,这当然是无效的。我也试过用反斜杠转义冒号,但这也不管用。

如何让 Resource 正确转义我的参数?我试过在调用之前用 %3A 替换冒号,但这导致 % 再次被编码,返回 404 Not Found.

处理资源的服务如下所示:

angular.module('adminApp').factory('MyObject', myObject);

function myObject($resource) {
    return $resource('/api/objects/:uri');
};

我这样称呼它:

MyObject.get({ uri: myUri }, function(result) {
...
});

我通过将 URI 作为查询参数而不是作为请求的一部分传递来解决这个问题 URL。我通过将我的资源服务更改为此来做到这一点:

angular.module('adminApp').factory('MyObject', myObject);

function myObject($resource) {
    return $resource('/api/objects');
};

并保持调用代码不变。 ngResource 然后创建一个看起来像 http://myserver/api/objects?uri=http:%2F%2Fexample.comk%2FmyURI%2FGET,这很好。

基本上,如果您在 API 参数中使用不寻常的字符,请将它们放在查询字符串中而不是 URL! :-)