我正在编写一个简单的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;
这意味着我包含了这些行动。
答案 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.DefaultTranslator.Translate(ExpressionConverter parent, MethodCall....
更正linq查询后,一切正常。 Visual Studio对我做linq查询错误很好。