Web API - 多种POST方法

时间:2013-01-14 20:04:35

标签: asp.net-mvc asp.net-web-api

我正在编写一个简单的web api应用程序。当我需要在我的web api控制器中使用两个POST方法时,我进入了一个阶段。其中一种方法有效,另一种则无效。我的路线表如下所示:

       config.Routes.MapHttpRoute(
            name: "ApiRouteWithAction",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

然后我的方法定义如下:

    [HttpPost]
    public bool PostTaskAgain(My3TasksWebAPI.Data.Task task)
    {
        var oldTask = _db.Task.Where(t => t.Id == task.Id).SingleOrDefault();

        oldTask.DoAgain = true;
        oldTask.DateUpdated = task.DateUpdated;

        if (_db.SetOfTasks.Where(t => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(t.DateCreated, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday) == CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday)).Any())
        {
            int currentSetOfTasksId = _db.SetOfTasks.OrderBy(s => s.DateCreated).FirstOrDefault().Id;

            My3TasksWebAPI.Data.Task newTask = new Data.Task() { CreatedBy = oldTask.CreatedBy, DateCreated = oldTask.DateCreated, DateUpdated = null, DoAgain = false, Notes = string.Empty, SetOfTasksId = currentSetOfTasksId, Status = false, Title = oldTask.Title, UserId = oldTask.UserId };

            _db.Task.Add(newTask);
        }

        _db.SaveChanges();

        return true;
    }

    // Post api/values/PostSetOfTasks/{setOfTasks}
    [HttpPost]
    public bool PostSetOfTasks(My3TasksWebAPI.Data.SetOfTasks setOfTasks)
    {
        _db.SetOfTasks.Add(setOfTasks);

        _db.SaveChanges();

        return true;
    }

当我尝试调用PostTaskAgain时,我收到内部服务器错误。我认为它可能是路由表,但我不知道如何处理两个post方法。 我从我的asp.net mvc应用程序中调用web api,如下所示:

HttpResponseMessage response = client.PostAsJsonAsync("api/values/PostSetOfTasks", model.SetOfTasks).Result;

HttpResponseMessage response = client.PostAsJsonAsync("api/values/PostTaskAgain", taskToPost).Result;

这意味着我包含了这些行动。

2 个答案:

答案 0 :(得分:3)

在webapi中使用POST可能会很棘手但是很难,你的问题变得微不足道。但是,对于那些可能偶然发现此页面的人:

我将专注于POST,因为处理GET是微不足道的。我不认为很多人会用webapis解决GET问题。不管怎么说..

如果您的问题是 - 在MVC Web Api中,如何 - - 使用除通用HTTP谓词以外的自定义操作方法名称? - 执行多个帖子? - 发布多个简单类型? - 通过jQuery发布复杂类型?

然后以下解决方案可能有所帮助:

首先,要在Web API中使用自定义操作方法,请添加以下网址:

public static void Register(HttpConfiguration config)
{
            config.Routes.MapHttpRoute(
                name: "ActionApi",
                routeTemplate: "api/{controller}/{action}");
}

他们可以创建像:

这样的动作方法
[HttpPost]
        public string TestMethod([FromBody]string value)
        {
            return "Hello from http post web api controller: " + value;
        }

现在,从浏览器控制台激发以下jQuery

$.ajax({
            type: 'POST',
            url: 'http://localhost:33649/api/TestApi/TestMethod',
            data: {'':'hello'},
            contentType: 'application/x-www-form-urlencoded',
            dataType: 'json',
success: function(data){ console.log(data) }
        });

其次,要执行多个帖子, 它很简单,创建多个动作方法并使用[HttpPost] attrib进行装饰。 使用[ActionName(“MyAction”)]指定自定义名称等。 将在下面的第四点来讨论jQuery

第三, 首先,在单个操作中发布多个SIMPLE类型是不可能的,并且有一种特殊格式可以发布单个简单类型(除了在查询字符串或REST样式中传递参数)。 这就是让我与Rest Clients一起敲打并在网上狩猎近5个小时的一点,最终,以下网址帮助了我。仍会引用该链接的内容可能会变死!

Content-Type: application/x-www-form-urlencoded
in the request header and add a = before the JSON statement:
={"Name":"Turbo Tina","Email":"na@Turbo.Tina"}

http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api

无论如何,让我们克服那个故事。继续:

第四,通过jQuery,ofcourse,$ .ajax()发布复杂类型将立即发挥作用:

让我们说action方法接受一个具有id和name的Person对象。所以,从javascript:

var person = { PersonId:1, Name:"James" }
$.ajax({
            type: 'POST',
            url: 'http://mydomain/api/TestApi/TestMethod',
            data: JSON.stringify(person),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            success: function(data){ console.log(data) }
        });

行动将如下:

[HttpPost]
        public string TestMethod(Person person)
        {
            return "Hello from http post web api controller: " + person.Name;
        }

以上所有,为我工作!! 干杯!

答案 1 :(得分:0)

我的LINQ查询存在问题。

The response from the server was: {"$id":"1","Message":"An error has occurred.","ExceptionMessage":"LINQ to Entities does not recognize the method 'Int32 GetWeekOfYear(System.DateTime, System.Globalization.CalendarWeekRule, System.DayOfWeek)' method, and this method cannot be translated into a store expression.","ExceptionType":"System.NotSupportedException","StackTrace":" at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTransl‌​ator.Translate(ExpressionConverter parent, MethodCall....

更正linq查询后,一切正常。 Visual Studio对我做linq查询错误很好。