我根据我最近开始工作的公司给出的给定架构来做后端。 我是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; }
}
答案 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
在某些情况下,为成功调用定义更明确的响应类型可能更好。为此,请为类型的状态代码添加[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
属性的非协作逻辑。