【问题标题】:How to make a PATCH request to am API with ASP.NET Core 2.2?如何使用 ASP.NET Core 2.2 向 API 发出 PATCH 请求?
【发布时间】:2023-03-29 06:03:01
【问题描述】:

我有一个在 ASP.NET Core 2.2 之上使用 C# 编写的应用程序。我创建了一个控制器来响应名为UpdatePATCH 请求。这是我的控制器

[Route("api/[controller]"), ApiController, Produces("application/json")]
public class CategoriesController : ControllerBase
{
    [HttpPatch("{propertyId}/{listId}/{isOn}"), Authorize]
    public ActionResult<bool> Update(int propertyId, int listId, bool isOn)
    {
        // Do something
        return true;
    }
}

另外,为了在用户未获得授权而不是重定向时返回 401 错误,我将以下代码添加到我的 Startup 类中

services.ConfigureApplicationCookie(config =>
{
    config.Events = new CookieAuthenticationEvents
    {
        OnRedirectToLogin = ctx =>
        {
            if (ctx.Request.Path.StartsWithSegments("/api", StringComparison.CurrentCultureIgnoreCase))
            {
                ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            }
            else
            {
                ctx.Response.Redirect(ctx.RedirectUri);
            }

            return Task.FromResult(0);
        }
    };
});

现在要使用 jQuery 调用此 API,我做了以下操作

$('.update-property').click(function (e) {
    e.preventDefault();
    var obj = $(this);
    $.ajax({
        url: '/api/Categories/Update',
        type: 'PATCH',
        data: {
            'propertyId': obj.data('property-id'),
            'listId': obj.data('list-id'),
            'isOn': obj.data('is-on') === 'True' ? 'false' : 'true'
        },

        success: function (response) {

            console.log(response);

            // if response unauthorized, redirect to the login page with the ReturnUrl
            // else if response.data is true then change the icon
        }
    });
});

但是这个请求一直返回一个 404 http 错误代码。我在开发者工具中检查了这个问题,我看到参数设置正确并且 URL 是有效的。

如何正确处理这个 PATCH 请求?

【问题讨论】:

  • 您在调试时遇到此错误吗?还是在 IIS 主机上?还是其他地方?
  • 我在控制台中收到错误消息。请求永远不会到达控制器

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.0 asp.net-core-2.2


【解决方案1】:
[Route("api/[controller]"), ApiController, Produces("application/json")]
public class CategoriesController : ControllerBase
{
    [HttpPatch("{propertyId}/{listId}/{isOn}"), Authorize]
    public ActionResult<bool> Update(int propertyId, int listId, bool isOn)

此处的路由模板确定更新端点的 URL。在这种情况下,生成的 URL 模板将是:

api/Categories/{propertyId}/{listId}/{isOn}

例如,此端点的有效 URL 将是 /api/Categories/12/34/true

如果您不想将值作为参数传递(因为您已经在正文中传递了它们),则必须更改路由模板。例如,您可以只删除 action 方法上的路由模板:

[HttpPatch, Authorize]
public ActionResult<bool> Update(int propertyId, int listId, bool isOn)
// …

那么,URL 就是api/Categories

当然,您也可以将api/Categories/Update 设为端点的 URL,但对于 REST,通常不建议在 URL 中包含方法名称。 PATCH 请求通常意味着“更新此资源”,然后您将指向该资源的 URL。

【讨论】:

    【解决方案2】:

    您需要使用localhost:44313/api/Categories url 发送请求。不要放更新前缀。您只需将补丁请求发送到您的localhost:44313/api/Categories 端点。

    带参数

    localhost:44313/api/Categories/{propertyId}/{listId}/{isOn}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 2013-01-05
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      相关资源
      最近更新 更多