Несанкционированное сообщение, статус 200 ОК - PullRequest
0 голосов
/ 29 апреля 2018

Я делаю бэкэнд в соответствии с заданной архитектурой, предоставленной компанией, с которой я недавно начал работать. Я новичок в C #, и теперь я пытаюсь сделать некоторые методы post / get / put для некоторых API. Есть проблема, которую я не смог решить. Почтальон говорит: { «код»: 1, "message": "Не авторизован" } Но код состояния - 200 OK.

UserController.cs

[Route("v1/users")]
[Produces("application/json")]
public class UserController : BaseController
{
    /// <summary>
    ///     Get list of users (Authorize)
    /// </summary>
    /// <returns>
    /// </returns>
    [ProducesResponseType(typeof(BaseResponseModel<List<UserResource>>), 200)]
    [HttpGet]
    public async Task<IActionResult> Get()
    {
        var user = await _userService.GetUserResourcesAsync();

        return Success(user);
    }
 }

Это не имеет никакого смысла, или я так глуп, чтобы осознать проблему? У меня есть метод входа в систему, и я могу войти, я получаю код успеха, затем я делаю это: введите описание изображения здесь Заголовок

IProductService.cs

    public interface IProductService
{
    Task<ProductDto>  GetAsync(int id);
}

ProductService.cs

        public async Task<ProductDto> GetAsync(int id)
    {
        var product = await _context.Product.SingleOrDefaultAsync(p => p.Id == id);
        return _mapper.Map<ProductDto>(product);

    }

ProductDto.cs

 public class ProductDto
{
    public int Id { get; set; }

    public CategoryDto CategoryId { get; set; }

    public string Title { get; set; }

    public bool AllowEdit { get; set; }

    public string ItemCode { get; set; }

    public string CustomerCode { get; set; }
 }

Product.cs

[Table("Products")]
public class Product : DomainModel<int>
{
    [Required]
    public int ProductCategoryId { get; set; }

    [ForeignKey("ProductCategoryId")]
    public virtual ProductCategory ProductCategory { get; set; }

    [Required, StringLength(256)]
    public string Title { get; set; }

    [Required, DefaultValue(false)]
    public bool AllowEdit { get; set; }

    [StringLength(50)]
    public string ItemCode { get; set; }

    [StringLength(50)]
    public string CustomerCode { get; set; }
}

1 Ответ

0 голосов
/ 29 апреля 2018

Используя ProducesResponseTypeAttribute, приписываемый API фактически определяет, каким должен быть код ответа для указанных типов. Смотрите определение из в ProducesResponseTypeAttribute .

Как это работает

Возьмем следующий пример, который показывает, что API выдает ошибку 404, если объект имеет значение null:

public IActionResult GetById(string id)
{
    var post = <<Your logic here>>;
    if (post == null)
    {
        return NotFound();
    }

    return Json(post);
}

Теперь тот же метод можно изменить на следующий, который будет возвращать 404 с использованием ProducesResponseType вместо того, чтобы код записывался в логике API.

[ProducesResponseType((int)HttpStatusCode.NotFound)]
public IActionResult GetPostById(string id)
{
        var post = <<Your logic here>>;
        return Json(post);
    }

enter image description here

В некоторых случаях может быть целесообразно определить более явный тип ответа для успешных вызовов. Для этого добавьте ProducesResponseTypeAttribute для кода состояния с типом. (возвращает тип в качестве параметра, что делает свойство Type для Produces избыточным). Это полезно, если вы хотите вернуть разные вещи из одного и того же метода, например, следующее возвращает два разных типа в зависимости от возвращенного кода состояния:

[ProducesResponseType((int)HttpStatusCode.NotFound)]
[ProducesResponseType(typeof(Model), (int)HttpStatusCode.OK)]
public IActionResult GetById(string id)

В чем ваша проблема

Теперь, если вы видите свой код, который определяет этот атрибут как [ProducesResponseType(typeof(BaseResponseModel<List<UserResource>>), 200)]. И код для загрузки пользователя:

var user = await _userService.GetUserResourcesAsync();

возвращает BaseResponseModel<T>. BaseResponseModel должен содержать свойство Code и Message. Итак, здесь ответ, возвращаемый API, имеет тип BaseResponseModel<T>, поэтому API вернет 200 HTTP Status, как определено атрибутом.

Как исправить

Либо вы возвращаете другой объект в случае исключения Unauthorize и присоединяете ProducesResponseType, специфичные для этого типа, ИЛИ обрабатываете неаторизованную логику на основе атрибута Authorize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...