Как перегрузить метод WebApi
Я новичок в WebApi, и сейчас у меня есть два метода httpPost, таких как
[HttpPost]
public List<YellowPages.Person> AddPersonDetails(YellowPages.Person person)
{
Repository.Repository.personsList.Add(person);
return Repository.Repository.personsList;
}
а второй метод
[HttpPost]
public List<YellowPages.City> getRelevantCity(string stateID)
{
return new Repository.YellowPages.City().getCity()
.Where(x => x.StateID ==stateID).ToList();
}
всякий раз, когда я вызываю метод getRelevantCity, вызывается метод AddPersonDetails, я считаю, что это как-то связано с архитектурой REST.
теперь мой вопрос: как я могу справиться с этой ситуацией. Есть ли что-нибудь, что я могу сделать в файле WebApiConfig.cs и добавить ограничения? если да, то как обрабатывать ограничения для типа модели, которые я использую.
Спасибо.
ОБНОВЛЕНИЕ 1
как я предположил, я изменил свой метод удаления атрибутов следующим образом
public List<YellowPages.Person> AddPersonDetails(YellowPages.Person person)
{
Repository.Repository.personsList.Add(person);
return Repository.Repository.personsList;
}
public List<YellowPages.City> getRelevantCity(string stateID)
{
return new Repository.YellowPages.City().getCity().Where(x => x.StateID == stateID).ToList();
}
Мой вызов ajax выглядит следующим образом
$('#StateID').change(function () {
$.ajax({
type: 'POST',
url: '/api/shoppingCart/getRelevantCity',
ContentType: 'application/json',
data: { 'stateID': $('#StateID').val() },
dataType: 'json',
success: function (returnData) {
var grid = '';
$.each(returnData, function (i, d) {
grid = grid + createDom(d);
});
$('#result').empty().append(
grid
);
},
error: function (xhr, ajaxOptions, thrownError) {
alert('error');
}
});
});
$('#btnAjax').click(function (e) {
debugger;
e.preventDefault();
var d = { 'PersonName': $('#PersonName').val(), 'gender': $('#gender').prop('checked', true).val(), 'StreetAddress': $('#StreetAddress').val(), 'StateID': $("#StateID option:selected").text(), 'Pincode': $('#Pincode').val() };
$.ajax({
type: 'POST',
url: '/api/shoppingCart/AddPersonDetails',
ContentType: 'application/json',
data: d,
dataType: 'json',
success: function (returnData) {
var grid = '';
$.each(returnData, function (i, d) {
grid = grid + createDom(d);
});
$('#result').empty().append(
grid
);
},
error: function (xhr, ajaxOptions, thrownError) {
alert('error');
}
});
});
Независимо от того, какой вызов ajax я создаю, вызывается первый метод, можете ли вы помочь мне, как его перекрыть?
ОБНОВЛЕНИЕ 2
мой вопрос прост
Предположим, если у меня есть 4 метода GET в моем webApi, то как я могу обрабатывать webApi, чтобы я мог реализовать все реализованные 4 метода GET.
Ответы
Ответ 1
Перейдите для маршрутизации атрибутов. В конфигурации api добавьте
config.MapHttpAttributeRoutes();
И над контроллером:
[RoutePrefix("api")]
public class ShoppingCartController....
И для действий:
[HttpPost]
[Route("getRelevantCity")]
public List<YellowPages.Person> GetRelevantCity
[HttpPost]
[Route("addPersonDetails")]
public List<YellowPages.Person> AddPersonDetails
Таким образом, ваш GetRelevantCity идеально должен быть методом GET, а не POST. Я бы предложил вам изменить это на HttpGet в действии, а также в вашем javascript-коде:
[HttpGet] //this is not required; as per naming convention this will be a GET request by default
[Route("getRelevantCity/{stateId}")]
public List<YellowPages.Person> GetRelevantCity(int stateId)
И в $.ajax измените type: 'GET'
и передайте stateId в параметрах или в виде строки запроса или api/getRelevantCity/123, где 123 является идентификатором состояния
Ответ 2
Это ваш случай?
Я полностью согласен с ответом о методах GET и POST, но вы можете использовать OdataController. Он будет выглядеть как обычный вызов для отдыха, но он может вызывать методы (которые вы определяете), такие как api/Object (123)/GetRelevantCity или api/Object (123)/getRelevantCity (но вместо api/Object/123)
Также вы можете создать собственное ограничение, основанное на теле запроса (пример ограничения):
Извините за этот способ чтения данных сообщения...
public class TypeConstraint: IHttpRouteConstraint
{
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values,
HttpRouteDirection routeDirection)
{
return IsItCorrect(request.Content.ReadAsStringAsync().Result);
}
}
этот способ чтения requestMessage
и там является полным примером множественной pust (этот код может быть не таким чистым и должен быть реорганизован, но я надеюсь, что идея довольно ясна)