2015-12-14 22 views
6

Hi wzywam moje API za pomocą poniższego koduJak wywołać API w C# za pomocą angularjs

$http.get('/api/controller/method?param=value'). 
      then(function (response) { 
       if (response.status == 200) { 
        console.log(response.data); 
       } 
      }); 

To działa dobrze w moim komputerze lokalnym (http://localhost/api/controller/method?param=value).

Ale kiedy go wdrożyć w serwerze z nazwą aplikacji aplikacja, to nie jest w stanie połączyć się z API (http://server-ip/app/api/controller/method?param=value).

Oczywiście nie będzie, ponieważ adres URL jest inny. Jaki jest więc właściwy sposób wywoływania interfejsu API w języku C#, aby działał na dowolnym serwerze.

Co próbowałem:
1. URL.Action: To nie działa w tym przypadku.
2. Nie chcę używać @ HTML.hidden
3. Zaproszenie wychodząc z lub bez ukośnika (/)

+0

Spróbujesz tego: http: // serwer-ip/api/kontroler/metoda? Parametr = wartość (tj. zastąp localhost nazwą twojej domeny) –

+0

która działa ...ale domyślnie angularJS wywołuje "http: // serwer-ip/app" w ten sposób .. – user3035305

+0

Api Url to wszystko o Routingu Api. Jeśli chcesz wywołać api jak 'server-api/app' musisz zmienić konfigurację trasy api w pliku webApi.config. –

Odpowiedz

0

Nie jestem pewien, czy ja undestood swoje pytanie poprawnie, ale jestem stosując kątową stałą ustawić adres URL serwera

angular.constant("CONSTS", { 
    "DEV_URL": "http://localhost:12345", 
    "LIVE_URL": "http://server-ip/app" 
}) 

a następnie w $ wywołanie http

$http.get(CONSTS.DEV_URL + '/api/controller/method?param=value'). 
    then(function (response) { 
     if (response.status == 200) { 
      console.log(response.data); 
     } 
}); 

Jestem pewien, że istnieje sposób, aby zautomatyzować ten (haustem chrząknięcie), ale nie zrobił” dotarłem jeszcze. Podczas wdrażania aplikacji po prostu ręcznie zmieniam stałą. Jeśli dowiem się, jak to zrobić, zaktualizuję odpowiedź.

Nadzieja to pomaga trochę ...

+0

Dobrze zrozumiałeś moje pytanie. Ale nie sądzę, jest to poprawny sposób na zrobienie tego. – user3035305

+0

Zostawię odpowiedź, mam nadzieję, że ktoś napisze lepszy, ja też chciałbym poznać lepszy sposób ... – vidriduch

0

nie wiem procesu kompilacji itp ale zazwyczaj można przechowywać ścieżkę aplikacji w pewnej stałej wartości kątowe i używać go, gdy dzwoni telefon API jako przedrostek.

Jeśli masz jakąś zautomatyzowaną kompilację, możesz łatwo przygotować pakiety wdrożeniowe ze zmienionymi wartościami (używając Gulp/Grunt/TeamCity/Octopus, cokolwiek chcesz).

1

zwykle rozwiązać ten problem za pomocą factory takiego -

Najpierw na stronie .cshtml załadować wszystkie wymagane js kątowych. Następnie należy utworzyć fabrykę za baseURL jak ta -

function(angular){ 
    var module = angular.module('NameOfMyModule'); //gt the module 
    module.factory('BaseUrl', function(){ 
     return '@Url.Action("Action", "Controller")'; 
    }); 
}(window.angular); 

Następnie wstrzyknąć że BaseURL wewnątrz kontrolera -

.... 
module.controller('SomeController', [...., 'BaseUrl', function(...., BaseUrl){ 
    $scope.baseUrl = BaseUrl; 

}]); 

....` 

Wreszcie poprzedzić go w url

$http.get($scope.baseUrl + /...../).then(....); 
0

//controller 
 
app.controller("sampleController", function($scope, commonService) { 
 

 
    //post 
 
    $scope.postData = function() { 
 
    var command = {} 
 
    commonService.postSample(command); 
 
    } 
 

 
    //get 
 
    commonService.getSample().then(function(data) { 
 
    $scope.permissionList = data; 
 
    }); 
 

 
}); 
 

 

 

 
//service 
 
app.service('commonService', function($http, $q) { 
 

 
    this.postSample = function(command) { 
 
    var deferred = $q.defer(); 
 
    $http({ 
 
     method: 'POST', 
 
     data: command, 
 
     url: '/Attendance/CreatePersonDailyLeave' 
 
     }) 
 
     .success(function(data) { 
 
     deferred.resolve(data); 
 
     }) 
 
     .error(function(data) { 
 
     deferred.reject(data); 
 
     }); 
 
    return deferred.promise; 
 
    } 
 

 

 
    this.getSample = function(id) { 
 
    var deferred = $q.defer(); 
 
    $http({ 
 
     method: 'GET', 
 
     async: true, 
 
     url: '/Attendance/GetRoles?id=' + id 
 
     }) 
 
     .success(function(data) { 
 
     deferred.resolve(data); 
 
     }) 
 
     .error(function(data) { 
 
     deferred.reject(data); 
 
     }); 
 
    return deferred.promise; 
 
    } 
 

 
});