【问题标题】:How to pass multiple type of parameters in web api from angularjs?如何从 angularjs 在 web api 中传递多种类型的参数?
【发布时间】:2016-09-13 21:32:38
【问题描述】:

我在将参数传递给我的 web api 时遇到了很大的困难。

有两种情况,我将它们都列出来。

  1. 我想在下面传递一个简单的字符串参数

        [HttpGet]
        public string VerifyName(string name)
        {
    
            return name + "hi";
        }
    

为此,我在我的 angularjs 控制器中创建了一个这样的 url。

var name = "hello";
            var msg = "";
            $http.get('/api/VisitorWeb/VerifyName', name).success(function (data) {
                 msg = data;
            }).error(function (data) {
                $scope.error = "An error has occured while adding! " + data;
            });

这会一直返回 404。还有

{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:43516/api/VisitorWeb/VerifyName'.","MessageDetail":"No action was found on the controller 'VisitorWeb' that matches the request."}
  1. 同样,当我尝试传递一个对象时,它会给出相同的结果

我的角度函数

var loginModel = {
           UserName: $scope.UserName,
            PassWord: $scope.Password
        };

        var msg = "";
        $http.get('/api/VisitorWeb/VerifyLogin', loginModel).success(function (data) {
             msg = data;
        }).error(function (data) {
            $scope.error = "An error has occured while adding! " + data;
        }); 

Web API 方法

[HttpGet]
    public string VerifyLogin(UserLoginDomainModel loginModel)
    {
        //do some business logic
        return "abc ";
    }

响应是 404。

WebApiConfig

public static void Register(HttpConfiguration config)
        {


config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new   MediaTypeHeaderValue("text/html"));

        config.MapHttpAttributeRoutes();

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

我认为基本的路由存在一些问题,但有些无法弄清楚它是什么,请提出建议

【问题讨论】:

  • 最好将复杂对象发布到 API
  • 首先注意到您没有提到路径的基本 url 完整 url 它应该包括 localhost 以及
  • 对于第一个示例,如果您将控制器方法更改为接受并使用id 参数而不是name,然后您可以将您的角度调用修改为$http.get('/api/VisitorWeb/VerifyName/' + name),它应该可以工作。正如其他人指出的那样,get 不接受对象。

标签: c# angularjs http-status-code-404 asp.net-web-api2


【解决方案1】:

这个动作:

[HttpGet]
public string VerifyName(string name)
{
    return name + "hi";
}

定义不带属性的路由被映射到标准约定路由到下面的URL中:

http://yourhost/apiVisitorWeb/VerifyName?name=myNameValue

因为您的路由模板 "api/{controller}/{action}/{id}" 需要一个名为 id(而不是 name)的参数作为 URI 的一部分。

如果您想继续使用您的路由,请使用上述 URI 或将参数名称更改为 id,这样您应该可以使用此地址:

http://yourhost/apiVisitorWeb/VerifyName/myNameValue

同样的事情也适用于您的复杂类型参数:在 GET 操作中,任何复杂参数都应作为查询字符串参数的集合从 URI 绑定。您的第二个操作将绑定到以下 URI:

http://yourhost/apiVisitorWeb/VerifyLogin?UserName=userNameValue&PassWord=myPassword

但由于许多原因(最重要的是安全性),这是一种不好的做法。我强烈建议您将这种操作转换为 POST 操作,以便您可以将模型作为请求的主体发送。

【讨论】:

    【解决方案2】:

    试试这个:

    $http({ method: "GET", url: "/api/VisitorWeb/VerifyName", params: { name: name} }).success() 
    

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      相关资源
      最近更新 更多