问题 如何重载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

我的问题很简单

假设我的webApi中有4个GET方法,那么我该如何处理呢   webApi,这样我就可以实现所有4个GET方法


5821
2017-08-28 16:08


起源

可能重复 Web API控制器中的多个HttpPost方法 - CodeCaster
@CodeCaster我的问题是如何在MapHttpRoute方法中为我的模型和字符串添加约束。可以为int和string添加约束但是如何为模型添加约束,请帮助我理解。 - Lijin Durairaj
我不确定你的意思。您是否希望根据POST的属性名称进行路由?然后你需要属性路由,就像重复中所解释的那样。 - CodeCaster
@CodeCaster我有两个post方法,现在一个接受字符串作为参数,另一个接受我的模型作为参数,我该如何处理这个场景,谢谢 - Lijin Durairaj
您 不能轻易做到这一点,只需使用属性路由(/YourController/AddPerson 和 /YourController/GetCity)。无论如何后者应该是GET。 - CodeCaster


答案:


转到属性路由。在你的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' 并在params中传递stateId或作为查询字符串或api / getRelevantCity / 123传递,其中123是状态id


15
2017-08-28 16:59





是吗 你的情况? 我完全同意有关GET和POST方法的答案,但你可以使用 OdataController。它看起来像常见的rest调用,但它可以调用方法(你定义的),如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的完整示例(此代码可能不是那么干净,应该重构,但我希望这个想法很清楚)


0
2017-10-19 22:02