2015-02-23 127 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 } 
      ); 
}