如何修复 - 请求的资源不支持 http 方法“POST”
Posted
技术标签:
【中文标题】如何修复 - 请求的资源不支持 http 方法“POST”【英文标题】:How to fix - The requested resource does not support http method 'POST' 【发布时间】:2017-07-04 06:12:00 【问题描述】:以下是 WebAPI 操作。在谷歌上搜索以下错误:-
请求的资源不支持http方法'POST'
我获得了链接数量并相应地更新了我的 api,但我仍然遇到同样的错误。
Web api not supporting POST methodASP.NET Web Api: The requested resource does not support http method 'GET'
[AcceptVerbs("POST")]
[HttpPost]
[Route("rename/userId/type/title/")]
public IHttpActionResult Rename([FromBody] int userId, [FromBody] string type, [FromBody] string title)
//my api stuff
但是当通过 post man 调用上述内容时仍然会抛出错误。
我该如何摆脱这个错误??
在方法参数列表中不使用[FromBody]
属性也可以解决这个问题吗?
非常感谢任何帮助/建议。 谢谢。
【问题讨论】:
很可能,还有另一个动作叫做“重命名”。并且 [Route("rename/userId/type/title/")] 与您的请求 url 不匹配。 @levent,已检查。没有这样的 【参考方案1】:你已经声明了需要url参数的路由
[Route("rename/userId/type/title/")]
所以当您向api/customer/rename
发送请求时,它与此方法不匹配。您应该从路由参数中删除您在请求正文中传递的参数
[Route("rename")]
确保您的控制器上有适当的RoutePrefix("api/customer")
属性。
第二个问题是多个[FromBody]
参数。你会得到 can't bind multiple parameters 错误。存在限制 - 您只能将一个参数标记为 FromBody。见Sending Simple Types注:
Web API 最多读取一次请求体,所以只有一个参数 一个动作可以来自请求体。如果您需要获得多个 请求正文中的值,定义复杂类型。
您应该创建包含所有参数的复杂类型
public class RenameModel
public int UserId get; set;
public string Type get; set;
public string Title get; set;
并将方法签名更改为
[HttpPost]
[Route("rename")]
public IHttpActionResult Rename(RenameModel model)
并将请求数据作为 application/x-www-form-urlencoded
发送【讨论】:
多个[FromBody]
很好,或者它可能是一个原因??
@Kgn-web 抱歉,不在。是的,这也是一个问题。更新了答案。确保路由前缀也是api/customer
问题已修复。谢谢:)【参考方案2】:
[Route("rename/userId/type/title/")]
public IHttpActionResult Rename([FromBody] int userId, [FromBody] string type, [FromBody] string title)
最后一个答案是正确的,您在路由中要求这些参数,但说您希望它们在帖子正文中。此外,通常路线会以名词而不是动词开头。你改名是什么? (即 [Route("users/rename/userId/type/title")]
根据你最初的帖子,试试这个:
[HttpPost]
[Route("rename/userId/type/title" Name = "RenameUser"]
public IHttpActionResult Rename(int userId, string type, string title)
_myServiceMethod.Rename(userId, type, title);
return new StatusCodeResult(HttpStatusCode.Created, this);
或者,如果您想在正文中发布信息: 声明您的数据合同:
public class User
public string Type get; set;
public string Title get; set;
然后在端点上:
[HttpPost]
[Route("rename/userId", Name = "RenameUserPost")]
public IHttpActionResult RenameUserPost(int userId, [FromBody] User userData)
return new StatusCodeResult(HttpStatusCode.Created, this);
请注意,在这两个返回中,“this”指的是从 ApiController 继承的控制器类。大摇大摆地验证了这两个,它们接受 POST 并返回状态代码。
希望这会有所帮助。
【讨论】:
Name属性有什么用?? 多个 [FromBody] 很好,或者它可能是一个原因?? 路由命名用于生成链接,例如,如果您想使用 Created(Uri location, T Content) 响应类型,您可以使用手动路由助手或 Ploeh 之类的东西。 Hyprlinkr 通过路由名称动态获取 Uris。因此,如果您更改路线,链接仍然是正确的。 我认为不允许使用多个 FromBody 属性。这可能是您的路线未上车的直接原因。也就是说,我还没有遇到过需要发布多个不同对象的实例。你的路线应该只处理一件事。在您的特定情况下,像上面第二个示例一样创建数据合同应该可以正常工作。以上是关于如何修复 - 请求的资源不支持 http 方法“POST”的主要内容,如果未能解决你的问题,请参考以下文章
TFS 评论“请求的资源不支持 http 方法 'POST'。”