我使用了几个角度的JS $resource定义,所有这些定义都从配置服务中检索它们的基本URL。例如:
$resource(config.baseURL() + '/api/v2/foo/:id', {id: '@id'})
$resource(config.baseURL() + '/api/v2/bar/:id', {id: '@id'})
这样做的原因是,在首次加载应用程序时,可以通过查询字符串参数更改基本URL。
我发现(显然是回顾一下),$resource使用的URL只初始化一次,因此有可能在处理基本$resource查询字符串参数之前初始化特定$resource的URL的争用条件。因此,我尝试将$resource声明更改为:
$resource(':baseURL/api/v2/foo/:id', {baseURL: config.baseURL(), id: '@id'})
不幸的是,基本URL正在转义-- //
被转换为%2F%2F
--因此整个URL无法正常工作。
有任何方法来抑制该参数的转义吗?(或者可能是解决问题的更好方法)?
发布于 2016-04-30 13:29:40
解决这一问题的另一种方法是使用提供程序并在配置阶段配置它。
下面是我不久前做过的类似的事情的例子。
.provider('Environment', function () {
var environments = {
dev: {
root: 'http://localhost',
port: 3000,
api: '/api',
version: 'v1'
}
};
var selectedEnv = 'dev';
var self = this;
this.setEnvironments = function (envs) {
if (!Object.keys(envs).length)
throw new Error('At least one environment is required!');
environments = envs;
};
this.setActive = function (env) {
if (!environments[env])
throw new Error('No such environment present: ' + env);
selectedEnv = env;
return self.getActive();
};
this.getEnvironment = function (env) {
if (!env)
throw new Error('No such environment present: ' + env);
return environments[env];
};
this.getActive = function () {
if (!selectedEnv)
throw new Error('You must configure at least one environment');
return environments[selectedEnv];
};
this.getApiRoute = function () {
var active = self.getActive();
return active.root + (active.port ? ':' + active.port : '') +
active.api + (active.version ? '/' + active.version : '');
};
this.$get = [function () {
return self;
}];
})
然后在配置阶段:
.config(function (EnvironmentProvider) {
EnvironmentProvider.setEnvironments({
dev: {
root: 'http://10.0.0.3',
api: '/api',
version: 'v1'
},
localonly: {
root: 'http://localhost',
api: '/api',
version: 'v1'
},
prod: {
root: 'https://myapp.mybackend.com',
api: '/api',
version: 'v1'
}
});
//Set prod as the active schema
EnvironmentProvider.setActive('prod');
});
稍后在某个控制器/服务/工厂中:
.factory('API',function($resource, Environment){
return {
User: $resource(Environment.getApiRoute() + '/users/:id', {id: '@_id'}),
OtherResource: $resource(Environment.getApiRoute() + '/otherresource/:id', {id: '@_id'})
}
});
发布于 2014-06-29 01:15:45
为什么不使用$location服务呢?
例如,如何处理基本url,如果应用程序是从本地主机运行的,则包括端口号?另外,能够包含基于当前URL的http或https吗?
var host = $location.host();
if (host === "localhost")
host += ":" + $location.port();
var url = $location.protocol() + "://" + host + "/whateverElseYouWantInThePath";
然后在你需要的地方使用url
?
发布于 2014-10-10 15:52:18
从资源的定义来看,
:
为前缀,如/user/:username
。如果您使用带有端口号的URL (例如,http://example.com:8080/api
),您需要在端口之前转义冒号字符djResource('http://example.com\\:8080/api')
。因此,您必须按照以下方式定义config.baseURL():
config.baseUrl = function(){
return 'http://server.com\\:port/rest_part/';
}
https://stackoverflow.com/questions/20142193
复制相似问题