2015-02-23 100 views
0

我有一個問題需要從我的工廠獲取API控制器的響應。AngularJS不能從工廠調用API控制器

我收到錯誤404頁未找到

我在HTML-document中得到了正確的.js-file,路由看起來很好。

App.js:

module.factory('userFactory', function($http) { 
return { 
    getFormData: function(callback) { 
     $http.get('/api/GetMessage').success(callback); 
    } 
    } 
}); 

module.controller("messageController", function($scope, userFactory) { 
    $scope.getMessage = function() { 
    userFactory.getFormData(function(results) { 
     $scope.text = results; 
    }); 
    } 
}); 

API控制器:

using System.Web.Http; 

namespace kittyChatt.Backend.Controllers { 
public class GetMessageController : ApiController 
{ 
    public object Get() 
    { 
     object obj = "hello world";   
     return obj; 
    } 
    } 
} 

我希望你好世界展現whene我在我看來,打了一個按鈕。

查看:

<div> 
    <button ng-click="getMessage()">Get my message</button> 
     <p>{{text}}</p> 
    </div> 

plz幫助!

回答

2
return { 
    getFormData: function(callback) { 
     $http.get('/api/GetMessage/Get').success(callback); 
    } 
} 

你忘了告訴你想要打電話給你的控制器。

默認情況下,行動是HttpPost(啊,我知道,我寫HTTPGET,這是在asp.net mvc的的情況下),但我建議你仍然裝飾方法與正確的動詞:

[HttpGet] 
public object Get() 
{ 
    object obj = "hello world";   
    return obj; 
} 

編輯,這絕對沒有的第一個問題鏈接:
從asp.net文件引用:

  • 您可以使用屬性指定HTTP方法:AcceptVerbs,HttpDelete,HttpGet,HttpHead,HttpOptions,HttpPatch,HttpPost或HttpPut。
  • 否則,如果控制器方法的名稱以「Get」,「Post」,「Put」,「Delete」,「Head」,「Options」或「Patch」開頭,那麼按照約定, HTTP方法。
  • 如果以上都不是,則該方法支持POST。

但是,我仍然認爲這是一個很好的習慣,總是在動詞上面裝飾動作。這種做法應該避免無用的討論;-)

+0

在的WebAPI,這不是一個動作,而是一個HttpVerb並且據推斷由它的名字。所以WebApi知道它是一個'Get',因爲方法名以'Get'開頭。你不需要明確地定義它 – 2015-02-23 14:20:07

+0

但是它們不是,如果我有'公共對象Post(){}'那麼這隻會迴應一個post請求。 – 2015-02-23 14:53:24

+0

thx,我用asp.net文檔的引用更新了我的答案。 (並且我刪除了我在評論中發佈的錯誤) – 2015-02-23 15:30:05

1

您的API的路徑路徑是否正確?

到配置您必須編寫這樣的事:

public static void Register(HttpConfiguration config) 
{ 
      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{action}/{id}", 
       defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional } 
      ); 
}