2016-01-29 28 views
0

我正在使用Angular的资源模块访问Web API,但由于API使用URI作为主键,所以遇到了问题。冒号不在资源参数中被URL编码

每当我尝试打电话给这个API,传入一个URI作为字符串参数,我得到400 Bad Request错误。经过仔细观察,Resource在URI中转义所有正斜杠,而不是在开始时转义冒号。它正在对一个如下所示的URL进行GET:http://myserver/api/objects/http:%2F%2Fexample.comk%2FmyURI%2F,这当然是无效的。我也尝试用反斜杠转义冒号,但这也不起作用。

我该如何让资源正确逃避我的参数?在拨打电话之前,我已尝试用%3A替换冒号,但导致%再次被编码,返回404 Not Found

的业务处理资源是这样的:

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

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

,我称它是这样的:

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

您是否尝试在冒号之前添加反斜杠? – Voreny

+0

@Voreny是的,它看起来像这样:'http:// myserver/api/objects/http%5C:%2F%2Fexample.comk%2FmyURI%2F',所以没有更好的! – Mourndark

回答

1

我已经通过将URI作为查询参数解决这个问题了而不是作为请求URL的一部分。我通过将我的资源服务更改为:

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

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

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

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