如何修复 - 请求的资源不支持 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 method

ASP.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”的主要内容,如果未能解决你的问题,请参考以下文章

请求的资源不支持 http 方法 'OPTIONS'。?

如何修复无效请求(不支持的 SSL 请求)

请求的资源不支持 HTTP 方法“GET”

TFS 评论“请求的资源不支持 http 方法 'POST'。”

请求的资源不支持 http 方法 'GET' 但使用 'POST'

使用 EnableCors 时“请求的资源不支持 http 方法 'OPTIONS'”