4 回答
TA贡献1828条经验 获得超13个赞
简短回答
事情可能就是这么简单。原因是路由。
只需将您的POST
请求发送到正确的 URL,例如https://localhost:44327/api/values/123
.
这不是问题。它按预期工作。
您GET向 提出请求https://localhost:44327/api/values/。它返回200 OK。
但是当你POST向同一个 URL 发出请求时https://localhost:44327/api/values/。它说405 Method not allowed。
然而,你得到了405。发生这种情况是因为您正在GET使用方法到达终点POST。
微软文档说:
...HTTP 客户端向 Web 服务器上的 Web API 应用程序的 URL 发送了有效的 JSON 请求,但服务器返回了 HTTP 405 错误消息,表明该 URL 不允许使用 PUT 方法。相反,如果请求 URI 与 Web API 应用程序的路由不匹配,服务器将返回 HTTP 404 Not Found 错误。
https://learn.microsoft.com/en-us/aspnet/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications
如果只是删除GET端点。请求POST将开始返回404 Not found。这意味着您没有到达任何已注册的路线。
要发送POST请求,您需要根据路由规则使用不同的 URL。
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// POST api/values
[HttpPost("{val}")]
public StatusCodeResult Post()
{
return Ok();
}
}
这种基于属性的配置意味着您的POST端点的路由是/api/Values/{val}。哪里{val}有什么价值。它不在端点中进行处理。
如果你想处理它,你应该将它传递给方法:
[HttpPost("{val}")]
public StatusCodeResult Post(string val)
{
return Ok();
}
TA贡献1765条经验 获得超5个赞
查看您定义的内容:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
然后是动作:
[HttpPost("{val}")]
public StatusCodeResult Post()
{
return Ok();
}
您的路由匹配以下 url:
https://localhost:44327/api/values/StatusCodeResult
它将采用控制器上定义的主路由 [Route("api/[controller]")]
然后您定义“模板”以使用“{val}”
这告诉它使用 ActionResult特定名称并期望 var val 被传递/附加。
在“路由模板中的令牌替换([控制器]、[操作]、[区域])”部分下
他们具体说明:
为了方便起见,属性路由通过将标记括在方括号 ([, ]) 中来支持标记替换。标记 [action]、[area] 和 [controller] 将替换为定义路由的操作中的操作名称、区域名称和控制器名称的值。在以下示例中,操作与注释中所述的 URL 路径匹配:
[Route("[controller]/[action]")]
public class ProductsController : Controller
{
[HttpGet] // Matches '/Products/List'
public IActionResult List() {
// ...
}
[HttpGet("{id}")] // Matches '/Products/Edit/{id}'
public IActionResult Edit(int id) {
// ...
}
}
如果您希望它仅基于动词进行路由(遵循每个 api 端点仅处理该特定对象的操作的模式),那么您可以将 post 方法更改为
[HttpPost]
public ActionResult Post(string val)
{
return Ok();
}
TA贡献1946条经验 获得超3个赞
我认为在你的控制器中你必须导入另一个库。尝试
using System.Web.Http;
代替
using Microsoft.AspNetCore.Mvc
TA贡献1818条经验 获得超11个赞
你的github上的代码,
// POST api/values
[HttpPost("{val}")]
public StatusCodeResult Post()
{
return Ok();
}
每个路由操作配置都需要一个值 {val}。由于您可能会尝试在没有任何价值的情况下击中帖子,因此这是不允许的。确保您提供一些值,然后执行 POST。如果您使用的是 POSTMAN,则可能必须为请求的正文提供一些值。Swagger 是一个很棒的实用工具,可以嵌入到 Web API 中,并且为我们的路线/资源提供了出色的直观 UI。这甚至可能是帮助确定并确保您提供正确价值的理想选择。
否则,您无需修改或担心 IIS 或 IIS Express 设置。或 webdav。
- 4 回答
- 0 关注
- 152 浏览
添加回答
举报