HTTP response status codes have so much importance in REST API’s. In any case if you want to return a status code from your ASP.NET Core API, all you have to do is in your controller method,
return StatusCode(StatusCodes.Status500InternalServerError);
StatusCode is from Microsoft.AspNetCore.Mvc.ControllerBase.StatusCode and StatusCodes from Microsoft.AspNetCore.Http.StatusCodes. The above code will return a 500 status code. Similar way, you can return any other status code. For the complete list,
👉 StatusCodes Class (Microsoft.AspNetCore.Http) | Microsoft Docs
HTTP status code 5xx indicates server error. 5xx series includes,
Status Code | Description | ASP.NET Core 2.2 |
500 | Internal Server Error | Status500InternalServerError |
501 | Not Implemented | Status501NotImplemented |
502 | Bad Gateway | Status502BadGateway |
503 | Service Unavailable | Status503ServiceUnavailable |
504 | Gateway Timeout | Status504GatewayTimeout |
505 | HTTP Version Not Supported | Status505HttpVersionNotsupported |
506 | Variant Also Negotiates | Status506VariantAlsoNegotiates |
507 | Insufficient Storage | Status507InsufficientStorage |
508 | Loop Detected | Status508LoopDetected |
510 | Not Extended | Status510NotExtended |
511 | Network Authentication Required | Status511NetworkAuthenticationRequired |
599 | Network Connect Timeout Error |
You can also return some additional data along with the status code. Here is an example,
[Route("{code}")]
[HttpGet]
[ProducesResponseType(typeof(Merchant), 200)]
public async Task<ActionResult> GetMerchant(string code)
{
var input = new EntityRequestDto<string>
{
Id = code
};
var result = await _merchantService.GetMerchant(input);
if (result.IsSuccess)
{
return Ok(result.Value);
}
_logger.LogError("FAILED: GetMerchant - ${result.Error}");
return StatusCode(StatusCodes.Status500InternalServerError, result.Error);
}
If another service which is a client of the above API, they can get the additional info by,
public async Task<MerchantPreviewDto> GetMerchant(string merchantCode)
{
try
{
var merchant = await $"{_apiBaseUri}/api/v1/merchants/{merchantCode}"
.WithOAuthBearerToken(...)
.GetJsonAsync<Merchant>().ConfigureAwait(false);
return ObjectMapper.Map<MerchantPreviewDto>(merchant);
}
catch (FlurlHttpException ex)
{
var error = await ex.GetResponseStringAsync();
throw new UserFriendlyException("Oops! There is a problem!", error);
}
}
Bonus
On the client service, I am using Flurl, which is my favorite HTTP client.
Flurl is a modern, fluent, asynchronous, testable, portable, buzzword-laden URL builder and HTTP client library for .NET.
Which one is your favorite HTTP client library for .NET?