如何从 angularjs 向 web api 传递多种类型的参数?
How to pass multiple type of parameters in web api from angularjs?
我在将参数传递到我的网站时非常挣扎 api。
有两种情况我会一一列举。
我想像下面这样传递一个简单的字符串参数
[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."}
- 同样,当我试图传递一个对象时,它给出了相同的结果
我的angular函数
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;
});
网络Api方法
[HttpGet]
public string VerifyLogin(UserLoginDomainModel loginModel)
{
//do some business logic
return "abc ";
}
响应是 404。
WebApi配置
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 }
);
}
我认为基本的路由存在一些问题,但有些无法弄清楚它是什么,请提出建议
试一试:
$http({ method: "GET", url: "/api/VisitorWeb/VerifyName", params: { name: name} }).success()
此操作:
[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 操作,这样您就可以将您的模型作为请求的主体发送。
我在将参数传递到我的网站时非常挣扎 api。
有两种情况我会一一列举。
我想像下面这样传递一个简单的字符串参数
[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."}
- 同样,当我试图传递一个对象时,它给出了相同的结果
我的angular函数
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;
});
网络Api方法
[HttpGet]
public string VerifyLogin(UserLoginDomainModel loginModel)
{
//do some business logic
return "abc ";
}
响应是 404。
WebApi配置
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 }
);
}
我认为基本的路由存在一些问题,但有些无法弄清楚它是什么,请提出建议
试一试:
$http({ method: "GET", url: "/api/VisitorWeb/VerifyName", params: { name: name} }).success()
此操作:
[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 操作,这样您就可以将您的模型作为请求的主体发送。