AngularJS - 带ID的动态URL

时间:2016-10-26 10:12:51

标签: javascript angularjs

config.js

angular.module('config', []).constant('ENV',
    {
        name: 'My Angular Project',
        apiEndPoint: 'http://SOMEIP/myServer', //API host,
        adminUrl:'/admin/regionid/site/siteid/admin/regionid', //endpoint
        loginUrl:'/login/regionid/site/siteid/device'

    });

controller.js

this.userLogin = function(username, password) {

var adminServicePath = ENV.apiEndPoint + ENV.adminUrl
//final url = http://SOMEIP/myServer/admin/1/site/1/admin/1

var loginServicePath = ENV.apiEndPoint + ENV.loginUrl
//final url = http://SOMEIP/myServer/login/2/site/2/device


return $http({
            method: 'POST',
            url: adminServicePath,
            headers: {                       
                "Authorization": "Basic ",
                "Content-Type": "application/x-www-form-urlencoded"
                }
        })

};

这里我将使用端点附加API以形成完整的URL。我的问题是regiondidsiteid是动态的。用户登录后,一个REST API请求将获取siteidregionid作为响应。

  • 如何使用ID动态替换网址中的siteidregionid 收到API回复?在收到响应中的id后,调用一个替换该值的函数。

3 个答案:

答案 0 :(得分:0)

您可以使用String.prototype.replace(substr, newsubstr)

您可以保留regionID而不是?



var ENV = {
  name: 'My Angular Project',
  apiEndPoint: 'http://SOMEIP/myServer', //API host,
  adminUrl: '/admin/?/site/?/admin/?', //endpoint
  loginUrl: '/login/?/site/?/device'

};


var adminServicePath = ENV.apiEndPoint + ENV.adminUrl.replace("?", 1).replace("?", 1).replace("?", 1);
console.log("Final url admin : " + adminServicePath);

var loginServicePath = ENV.apiEndPoint + ENV.loginUrl.replace("?", 2).replace("?", 2);
console.log("Final url login : " + loginServicePath);




答案 1 :(得分:0)

我假设只能从对登录端点的响应中获取siteidregionid

出于显而易见的原因,使用常量可能不是最好的想法(即它们是常量,并且在您想要创建它们时无法创建)。

相反,你可以做一些事情 - 一个可能适用于很多用例的简单解决方案是创建一个包装API调用的登录服务,然后在服务或其他服务中设置一个值可以注入你需要的任何地方。

可能看起来像这样:

angular.module('app')
  .service('loginService', function($http) {
    var siteId,
        regionId;

    function login(username, password) {
      return $http({
        method: 'POST',
        url: '<login endpoint here>',
        headers: {                       
          "Authorization": "Basic ",
          "Content-Type": "application/x-www-form-urlencoded"
        }
      })
      .then(function(result) {
        siteId = result.siteId;
        regionId = result.regionId;
      });
    }
  ); 

这使您在登录后需要进行API调用时可以使用这些值。但是,这不是很好,因为您需要将loginService注入需要它的任何控制器/服务中,该控制器/服务可能根本不关心登录服务。

一种改进的方法可能是拥有一个API服务来执行http gets / sets / puts / posts /以及数据访问层访问的任何内容。在此服务中,您可以设置/获取siteidregionid

可能看起来像这样:

angular.module('app')
  .service('api', function($http) {
     var siteId,
         regionId;

     var defaultHeaders = {
       "Authorization": "Basic ",
       "Content-Type": "application/x-www-form-urlencoded"
     };

     function post(url, options) {
       return $http({
         method: 'POST',
         url: url,
         headers: options.headers ? options.headers : defaultHeaders
       });
     }

     // Other functions to perform HTTP verbs...
  });

angular.module('app')
  .service('loginService', function(api) {
    function login(username, password) {

      api.post('urlHere', options)
        .then(function(result) {
          api.siteId = result.siteId;
          api.regionId = result.siteId;
        });
    }
  });

然后,您可以访问自己喜欢的siteidregionid

例如:

angular.module('app')
  .controller('someService', function(api) {
    function doSomethingWithTheApi() {
      var url = 'www.google.com/' + api.siteId + '/' + api.regionId + 'whatever-else';
      return api.post(url, {});
    }
  );

注意:上面的代码并不完整,但是它让您非常了解您可以采取的方法,这种方法相当干净,不太苛刻且易于测试:)

希望有所帮助!

答案 2 :(得分:0)

而不是常数,你可以使用值。

angular.module('config', []).value('ENV',
    {
        name: 'My Angular Project',
        apiEndPoint: '', //API host,
        adminUrl:'', //endpoint
        loginUrl:''

    });

在API调用后注入ENV并设置所有值。

ENV.name = xyz;
ENV.apiEndPoint = xyz;
ENV.adminUrl = xyz;
ENV.loginUrl = xyz;

但刷新浏览器后,这些值可能会设置为默认值。