gpt4 book ai didi

asp.net-mvc - Web API - 多种 POST 方法

转载 作者:行者123 更新时间:2023-12-02 12:47:48 26 4
gpt4 key购买 nike

我正在编写一个简单的 Web API 应用程序。我的 Web api Controller 中需要有两个 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;

这意味着我包含了这些操作。

最佳答案

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

我将特别关注 POST,因为处理 GET 是微不足道的。我不认为很多人会四处寻找解决 webapis 的 GET 问题。无论如何..

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

那么以下解决方案可能会有所帮助:

首先,要在 Web API 中使用自定义操作方法,请添加一个 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] 属性进行装饰。使用 [ActionName("MyAction")] 分配自定义名称等。下面第四点会谈到jQuery

第三,首先,在单个操作中发布多个 SIMPLE 类型是不可能的,并且有一种特殊的格式可以发布单个简单类型(除了在查询字符串或 REST 样式中传递参数之外)。这就是让我苦苦思索 Rest Clients 并在网上搜索了近 5 个小时的原因,最终,以下 URL 帮助了我。仍然会引用链接的内容,因为链接可能会失效!

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 发布复杂类型,当然,$.ajax() 将立即发挥作用:

假设操作方法接受一个具有 id 和名称的 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;
}

以上所有内容都对我有用!干杯!

关于asp.net-mvc - Web API - 多种 POST 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14325794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com