未经授权的消息,状态200确定

时间:2018-04-29 02:27:37

标签: c# postman

我根据我最近开始工作的公司给出的给定架构来做后端。 我是C#的新手,现在我正在尝试为某些api-s做一些post / get / put方法。 有一个问题,我无法解决它。 邮递员说:  {     “代码”:1,     “消息”:“取消授权” } 但状态代码是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);
    }
 }

这没有任何意义,或者我是如此愚蠢地意识到这个问题? 我有一个登录方法,我可以登录,我得到成功代码,然后我这样做: enter image description here Header

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 :(得分:0)

使用toMap,属性API实际上定义了指定类型的响应代码。看到定义  在ProducesResponseTypeAttribute

工作原理

以下示例显示,如果对象为null,则API会抛出404错误:

ProducesResponseTypeAttribute

现在可以将相同的方法更改为以下方法,它将使用public IActionResult GetById(string id) { var post = <<Your logic here>>; if (post == null) { return NotFound(); } return Json(post); } 返回404,而不是在API逻辑中编写代码。

ProducesResponseType

enter image description here

在某些情况下,为成功调用定义更明确的响应类型可能更好。为此,请为类型的状态代码添加[ProducesResponseType((int)HttpStatusCode.NotFound)] public IActionResult GetPostById(string id) { var post = <<Your logic here>>; return Json(post); } 。 (返回类型作为参数,这使得Produces的Type属性变为冗余)。 如果您想从同一个方法返回不同的内容,这很有价值,例如,以下内容根据返回的状态代码返回两种不同的类型:

ProducesResponseTypeAttribute

你的问题是什么

现在,如果您看到将此属性定义为[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应包含BaseResponseModel<T>Code属性。所以这里,API返回的响应类型为Message,因此API将返回由属性定义的200 HTTP状态。

如何修复

如果BaseResponseModel<T>异常,则返回另一个对象,并附加特定于该类型的Unauthorize或处理基于ProducesResponseType属性的非协作逻辑。