我有一个Web API操作如下:
[HttpPost]
public List<FavoriteDTO> GetFavoritesPaged(long userId, PagingInfo pagingInfo)
{
var result = _userService.GetFavoritesPaged(fav => fav.UserId == userId, pagingInfo);
var favDTOs = ConvertToDTOs(result.Source);
return favDTOs;
}
我需要使用HttpClient调用它,我正在尝试如下:
需要将分页信息传递给get方法。
var pagingInfo = new PagingInfo()
{
PageIndex = 1,
PageSize = 10,
OrderBy = "URL",
OrderDirection = OrderDirection.Desc
};
其中OrderDirection是枚举:
public enum OrderDirection
{
Asc,
Desc
}
var detailURI = "Favorites/GetFavoritesPaged?userId="+34;
HttpClient client = new HttpClient()
client.BaseAddress="mywebApiAddress";
var response = client.PostAsJsonAsync(detailURI, pagingInfo).Result;
response.EnsureSuccessCode();
var result = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result,
tyepof(FavoritesDTO));
但是,它不起作用。它说内部服务器错误,我在这里缺少的;是导致问题的枚举还是其他什么?我有其他WebAPI正常工作;没有一个像这样的参数。
这是我的routConfig:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
使用多个参数调用WebAPI是正确的方法还是有更好的方法,请提出建议?
修改-1: 改变了这个:
var detailURI = "Favorites/GetFavoritesPaged?userId?"+34;
为:
var detailURI = "Favorites/GetFavoritesPaged?userId="+34;
这一切都是一个错字:)
修改-2:
使用EDIT-1,请求转到WebAPI方法(这是错误的):
[HttpPost]
public FavoriteDTO AddToFavorites(FavoriteDTO favoriteDTO)
{
------code to add to db------
}
但是,当我将routeConfig编辑为以下内容时:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
然后我开始得到以下异常:
ReasonPhrase: Not Found
Request: {Method: POST, RequestUri: 'http://localhost:60208/api/Favorite/GetPagedFavorites?user=1', Version: 1.1, Content: System.Net.Http.ObjectContent`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], Headers:{ Content-Type: application/json; charset=utf-8 Content-Length: 44}}
答案 0 :(得分:3)
您可以尝试在控制器方法上添加ActionName属性。然后将ActionName附加到查询字符串。
/ ActionName?PARAM =值
答案 1 :(得分:1)
你的网址错了。试试这样:
var detailURI = "Favorites/GetFavoritesPaged?userId=34";
或使用{id}
路线:
var detailURI = "Favorites/GetFavoritesPaged/34";
但您必须修改参数名称:
public List<FavoriteDTO> GetFavoritesPaged(long id, PagingInfo pagingInfo)
答案 2 :(得分:0)
另一种方法是发布匿名类型,让Controller接受动态。
var response = client.PostAsJsonAsync(new { detailURI, pagingInfo }).Result;
[HttpPost]
public List<FavoriteDTO> GetFavoritesPaged([FromBody]dynamic model)
{
PagingInfo pagingInfo = (PagingInfo)model.pagingInfo;
long userid = (long)model.userId;
...
}