У меня есть действие Web API следующим образом:Как передать несколько параметров в действие WebAPI с использованием метода HttpClient.PostAsJsonAsync?
[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 с несколькими параметрами или есть лучший способ, пожалуйста, предложите?
EDIT-1: изменил это:
var detailURI = "Favorites/GetFavoritesPaged?userId?"+34;
к:
var detailURI = "Favorites/GetFavoritesPaged?userId="+34;
Все это опечатка :)
EDIT-2:
С РЕД-1, запрос идет к follwing метод 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}}
только что обновил мой вопрос, как вы указали. И его работа. Но, есть ли лучший способ, о котором вы можете думать; вместо этого (добавление параметров в url). – Baig
Нет ничего плохого в передаче параметра Id в URL. Другая возможность - использовать модель представления и поместить все в полезную нагрузку тела POST, а затем заставить ваше действие принять один параметр, который будет представлять вашу модель представления. –
Actualy, он все еще не работает. Он переходит к другому методу, который также имеет атрибут verst POST и один параметр. [Первоначально я был не прав, когда я сказал, что он работает, так как я не заметил, что он собирается куда-то еще]. Когда я изменяю конфигурацию маршрута (см. Редактирование), он говорит «Не найдено». Подробнее см. В разделе «Редактирование». – Baig