我试图从我的角度控制器调用web api控制器上的httpGet,但我能做的任何事情都不允许我传递多个参数。
我尝试将参数添加到路线中,(route/{email}/{firstName}/{lastName}
。
我可以验证角度方法getCurrentAlumniInfo
是否被调用并且正在尝试路由到控制器。我使用Postman,使用以下URI,
"localHost: PortNumber/api/alumni/currentAlumniInfo?Email=flintrock&FirstName=Fredf&LastName=Flintstone"
以下是相关摘要。首先,WebApiConfig使用属性路由:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
}
}
接下来我的api控制器
[RoutePrefix("api/Alumni")]
public class AlumniController : ApiController
{
private readonly AlumniRepository _repository;
private readonly AuthRepository _authRepository;
public AlumniController()
{
_repository = new AlumniRepository();
_authRepository=new AuthRepository();
}
[Route("alumniInfo")]
[HttpGet]
public IHttpActionResult GetAlumniInfo([FromUri]string email,string firstName, string lasttName)
{
return Ok("Success" + lasttName);
}
}
}
最后,角度(v.1)
var getCurrentAlumniInfo = function() {
var alumniData = alumniModel.buildAlumniMatchData();
var deferred = $q.defer();
//string email, string lastName,string middleName, string firstName
$http.get(serviceBase + 'api/alumni/alumniInfo',
{
params: {
Email: encodeURIComponent(alumniData.email),
FirstName: alumniData.firstName,
//MiddleName: alumniData.middleName,
LastName: alumniData.lastName
}
})
.then(function(response) {
deferred.resolve(response);
})
.catch(function(response) {
alert(response.statusCode + " error: " + response.status);
deferred.reject(response);
});
return deferred.promise;
};
为了它的价值,我使用了v.4.5.2的框架和Visual Studio 2015.
任何帮助表示感谢。
答案 0 :(得分:0)
您应该将 获取 方法更改为 发布 并将参数作为模型传递,以便您可以将模型作为API的参数接收。
<强>服务强>
$http.post(serviceBase + 'api/alumni/alumniInfo',
{
params: {
Email: encodeURIComponent(alumniData.email),
FirstName: alumniData.firstName,
//MiddleName: alumniData.middleName,
LastName: alumniData.lastName
}
})
.then(function(response) {
...
})
.catch(function(response) {
...
});
模型
public class RecieveModel
{
public string Email {get;set;}
public string FirstName {get;set;}
public string LastName{get;set;}
}
API
[Route("alumniInfo")]
[HttpPost]
public HttpResponseMessage GetAlumniInfo(ReceiveModel model)
{
return Request.CreateResponse(HttpStatusCode.OK);
}
或强>
更改路线配置defaults: new { id = RouteParameter.Optional ,id1 = RouteParameter.Optional,id2 = RouteParameter.Optional}
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{id1}/{id2}",
defaults: new { id = RouteParameter.Optional ,id1 = RouteParameter.Optional,id2 = RouteParameter.Optional});
答案 1 :(得分:0)
如果其他人在这里寻求解决问题,这对他们没有帮助 - 除非他们的编码太晚了。答案在我的代码中。我输入了一个带有两个t的参数字符串lasttname。是的,它实际上是那么容易和那个愚蠢的我看了一个小时没有意识到它。今天早上只看到这个问题,就像480磅一样突出了两个。字体。 使用属性路由,实际上所需要的只是参数名称与URI变量名称匹配。可以创建模型并将[FromUri]属性添加到参数中,但在这种情况下不需要。
所以,控制器可以简单地
[Route("alumniInfo")]
[HttpGet]
public IHttpActionResult GetAlumniInfo(string email, string firstName, string lastName)
{
return Ok("Success" + lastName);
}