2014-09-10 45 views
6

我正在與AngularJS和ASP.Net的Web API一起工作。我在API中的TestController,因爲它得到的是這麼簡單:Angular接收String作爲數組?

public class TestController : ApiController { 
    [HttpGet] 
    public String Ping() { 
     return "Pong"; 
    } 
} 

在Chrome中我可以去http://localhost/api/Test/Ping和提琴手給出了一個簡單"Pong"結果和瀏覽器顯示:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Pong</string> 

早在角JS,我建立一個工廠調用ping功能:

app.factory('API', ['$resource', function ($resource) { 
    return { 
     Ping: function() { 
      var result = $resource('api/Test/Ping', {}, { get: { method: 'GET' }, isArray: false }); 
      return result.get(); 
     } 
    }; 
}]); 

而一個超級簡單的控制:

app.controller('MyCtrl', [ '$scope', 'API', function ($scope, API) { 
    $scope.CallTest = function() { 
     API.Ping().$promise.then(function (response) { 
      alert(response); 
     }); 
    } 
}]); 

當我點擊CallTest被綁定的按鈕時,它會進行調用,API會像返回Pong一樣返回對象,但返回對象並不是我所期望的。響應是一個奇怪的物體:

{ 
    0: """, 
    1: "P", 
    2: "o", 
    3: "n", 
    4: "g", 
    5: """, 
    $promise: {...}, 
    $resolved: true 
} 

我沒有收到任何錯誤和語法上的一切工作正常。然而,我希望response將是一個字符串,特別是因爲我在我的API工廠中將isArray設置爲false。我相信角必須返回一個「Resource」,其上有一個$promise$resolved,所以我現在明白它可能不會那樣工作。除了在WebAPI中使用一個簡單的包裝器來返回一個字符串作爲Model中的參數之外,是否有可用的客戶端選項,以便response可以包含一個普通字符串而不是此僞數組?喜歡也許response.data什麼的?

編輯:當我從瀏覽器請求,Accept頭包含:

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 

其中在XML結果上述結果。當角請求相同的URL,則Accept頭包含:

application/json, text/plain, */* 

這導致簡單地被"Pong"

+0

爲什麼你不只是在你的web api中使用JSON.net並且返回json或者JObject到angular? – Owen 2014-09-10 17:17:05

+0

@Owen我可以用JSON,XML,SOAP,任何東西包裝它,但是一個簡單的字符串應該是最容易解析的東西。 – 2014-09-10 17:21:34

+0

從我發現的,將文字轉儲到$資源中會將文字轉換爲字符串數組。將值傳遞給$ resource以用作參數時,發生這種情況。如果該值不是分配的變量,則該字符串被分解爲數組。用文字的值賦值變量是解決這個問題的最快方法。從我的Web API獲取數據,我只通過JObjects。 – Owen 2014-09-10 18:39:42

回答

10

如在該文檔中描述,$resource一家工廠創建資源對象,用於與RESTful的服務器端數據源交互。

就你而言,你並沒有嘗試與適當的RESTful數據源進行交互,因此行爲似乎很奇怪。

直到你有一個正確的RESTful的數據源,而你只是想打一個API端點和檢索一個簡單的反應(如字符串),你應該使用$http service

$http.get('api/Test/Ping').success(function (data) {...})... 

例如:

app.factory('API', ['$http', function ($http) { 
    return { 
     Ping: function() { 
      return $http.get('api/Test/Ping'); 
     } 
    }; 
}]); 

app.controller('MyCtrl', ['$scope', 'API', function ($scope, API) { 
    $scope.CallTest = function() { 
     API.Ping().success(function (data) { 
      alert(data); 
     }); 
    }; 
}]); 
+1

好點。自從我開始使用$ resource以來,我完全調出了$ http。這是一個需要保證的情況。 – Owen 2014-09-10 19:55:30

0

如在角庫here描述的響應的內容,字符串被轉換爲對象時shallowClearAndCopy迭代密鑰。在我的情況下,將字符串文字傳遞給$ resource會導致文字變成一個字符數組。我能夠解決這個問題的第一種方法是將文字分配給一個變量並傳遞變量。

api.Trip.get(data.token) - Incorrect 
api.Trip.get({token: data.token}) - Correct. 

鑑於您是來自Web API,這很可能需要您的響應作爲JObject或JToken發送。我的Web API使用Newtonsoft的JSON.net庫返回JObject,而Angular還沒有跳過節拍。

相關問題