错误的$ http Get方法被调用

时间:2016-01-10 22:06:37

标签: c# angularjs html5 asp.net-web-api

我正在尝试使用$ http.get方法来检索记录。我调用了我的空Get方法,而不是接受调用参数的Get方法。有人能告诉我我做错了什么以及如何修复它以便调用正确的Get方法?

这个RegistrationController

// Empty method that gets hit
public HttpResponseMessage Get()
{
    var response = new HttpResponseMessage();

    return response;
}

// How do I structure my $http.get to have this method called?
public HttpResponseMessage Get(int pilotId)
{
    PilotModel pilot = this.RetrievePilot(pilotId);

    var response = new HttpResponseMessage();

    // If returnValue is null, the email or password was incorrect.
    if (pilot != null)
    {
        response = Request.CreateResponse<PilotModel>(HttpStatusCode.Created, pilot);
    }
    else
    {
        response = Request.CreateResponse<PilotModel>(HttpStatusCode.BadRequest, pilot);
    }

    return response;
}

前端(删除额外代码不需要显示问题......我相信)

var app = angular.module('MyRegistrationApp', []);

app.controller('RegistrationController', function ($scope, $http) {
    initializeVariables();

    var loggedInUser = JSON.parse(window.sessionStorage.getItem('LoggedInUser'));

    if (loggedInUser !== null && loggedInUser.PilotId > 0) {

        // Shouldn't this url cause the Get with parametes to be called?
        var url = 'api/registration/' + loggedInUser.PilotId;

        $(document).ready(function () {
            $http({
                method: 'GET',
                url: url,
            }).then(function successCallback(response) {
                initializeVariables(response);
            }, function errorCallback(response) {
                alert(response.statusText);
            });
        });
    }
});

1 个答案:

答案 0 :(得分:1)

您的问题是您打算对此进行GET调用

http://my-api-url/api/registration/1

但事实上,你的控制器正在期待这个:

http://my-api-url/api/registration?pilotId=1

只需尝试将url变量更改为以下示例,您就会看到它采取正确的行动。

var url = 'api/registration?pilotId=' + loggedInUser.PilotId;

这是因为在 GET 请求中,参数作为查询字符串发送。如果您对此感到满意,只需将url更改为上面的代码即可。如果没有,那么需要在API中进行一些调整,但不要害怕。

<强>这个RegistrationController:

[RoutePrefix("api")]
public class RegistrationController : ApiController
{
    [Route("registration")]
    public HttpResponseMessage Get()
    {
        var response = new HttpResponseMessage();

        return response;
    }

    [Route("registration/{pilotId:int}")]
    public HttpResponseMessage Get(int pilotId)
    {
        var response = new HttpResponseMessage();

        //Your code goes here...
        return response;
    }
}

通过RegistrationController中的这些修改,您现有的代码将按预期工作。基本上所有“魔力”都是Route属性,可以让您更好地控制API中的URL。

这条特殊的路线:

[Route("registration/{pilotId:int}")]

创建一个由“api / {controller} /”组成的URL,后跟在约束int中定义的{pilotId:int}类型的参数。使用此约束,我们强制在“registration”之后传递的参数必须是int。

我建议您在Attribute Routing上查看本教程,这非常有帮助。