Как сделать запрос PATCH для API с ASP.NET Core 2.2? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть приложение, написанное с использованием C# поверх ASP.NET Core 2.2.Я создал контроллер, который отвечает на запрос PATCH с именем Update.Вот мой контроллер

[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 class

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);
        }
    };
});

Теперь, чтобы вызвать этот API с помощью jQuery, я сделал следующее

$('.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
        }
    });
});

Но этот запрос продолжает возвращать код ошибки http 404.Я проверил этот вопрос в инструментах разработчика и вижу, что параметр задан правильно, а URL действителен.

Как правильно обработать этот запрос PATCH?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018
[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.

Если вы не хотитепередать значения в качестве параметров (так как вы уже передаете их в теле), вы должны изменить шаблон маршрута.Например, вы можете просто удалить шаблон маршрута в методе действия:

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

Тогда URL будет просто api/Categories.

Конечно, вы также можете сделать api/Categories/Update URL для конечной точки, но с REST обычно не рекомендуется иметь имена методов в URL.Запрос PATCH обычно означает «обновить этот ресурс», и тогда вы будете указывать на URL-адрес ресурса.

0 голосов
/ 21 декабря 2018

Вам необходимо отправить запрос с localhost:44313/api/Categories URL.Не ставьте префикс обновления.Вам просто нужно отправить запрос Patch на конечную точку localhost:44313/api/Categories.

с параметрами

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

...