2016-10-26 2 views
0

config.jsAngularJS - Динамический URL с ID

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. Моя проблема regiondid и siteid являются динамическими. После того, как пользователь войдет в систему, один запрос REST API получит в ответ siteid и regionid.

  • Как динамически заменить siteidregionid и в URL с идентификаторами получил в ответ API? После получения идентификатора в ответ вызовите функцию, которая заменяет значение.

ответ

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);

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 получает/устанавливает/puts/posts/whatever и к которому обращается ваш уровень доступа к данным. Внутри этой службы вы можете установить/получить siteid и regionid.

Это может выглядеть следующим образом:

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, {}); 
    } 
); 

Примечание: Приведенный выше код не является полным, но это дает очень хорошее представление о подходе вы могли бы принять, что является достаточно чистым, не слишком Hacky и легко проверяемый :)

Надеюсь, что это поможет!

+0

'function post (url, params, options) { // Код для создания вашего сообщения здесь - не забудьте вернуть обещание. } 'означает вызов API для извлечения siteid и regionid в ответ? Что может быть параметрами в 'api.post ('urlHere', params, options)'? URL-адрес будет кратным – Slimshadddyyy

+0

О, я имею в виду, что это может быть объект, содержащий заголовки для вашего запроса (например, 'headers: {" Authorization ":" Basic "," Content-Type ":" application/x-www- form-urlencoded "}'. Вы можете настроить его так, как вам нравится :) Я обновлю код, чтобы показать, что я имею в виду. –

+0

Как я уже упоминал, код, который я вам предоставил, вам нужно будет отрегулировать в соответствии с вашими потребностями, но он определенно описывает общий подход к решению проблемы, с которой вы сталкиваетесь :) –

0

вместо постоянного, вы можете использовать значение.

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

    }); 

Ввести ENV и установить все значения после вызова API.

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

но значения могут быть установлены по умолчанию после обновления браузера.

Смежные вопросы