1024programmer Asp.Net Middleware for .net core custom specification responses

Middleware for .net core custom specification responses

Middleware for .net core custom specification responses

In this article, we will introduce how to use middleware in .NET Core to customize canonical responses so that uniform formats and error messages can be returned when API calls. Middleware is a software component that can execute logic in the request and response pipeline, which can modify, intercept or process the request or response. We’ll use a simple example to demonstrate how to create and use middleware for custom canonical responses.

First, we need to create a class to represent the format of the canonical response. This class can contain the following attributes:

  • Code: The status code of the response, for example, 200 means success, 400 means client error, 500 means server error, etc.
  • Message: The response message, such as “OK” means success, “Bad Request” means client error, “Internal Server Error” means server error, etc.
  • Data: The response data can be any type of object, such as user information, product list, order details, etc.

The code for this class is as follows:

public class ApiResponse
 {
     public bool Success { get; set; }
     public string Message { get; set; }
     public object Data { get; set; }

     public ApiResponse(bool success, string message, object data)
     {
         Success = success;
         Message = message;
         Data = data;
     }

     public ApiResponse(bool success, string message)
         : this(success, message, null)
     {
     }

     public ApiResponse(bool success)
         : this(success, null, null)
     {
     }
 }
 

Middleware

Next, we need to create a middleware class to implement the logic of the custom specification response. This class needs to have the following characteristics:

  • Receives a parameter of type RequestDelegate, indicating the next middleware or terminal handler.
  • Implement an InvokeAsync method that receives a parameter of type HttpContext, indicating the context of the current request.
  • In the InvokeAsync method, use await next(context) to call the next middleware or terminal handler and get the response it returns.
  • In the InvokeAsync method, construct an ApiResponse object according to the status code and content of the response, and serialize it into JSON format.
  • In the InvokeAsync method, modify the content type of the response to application/json, and write ApiResponse in JSON format to the response body middle.
  • GetStatusCodeMessage()Give information according to the response status
  • GetResponseData()Get the response returned by it

CustomResponseMiddleware

public class CustomResponseMiddleware
 {
     private readonly RequestDelegate_next;

     public CustomResponseMiddleware(RequestDelegate next)
     {
         _next = next;
     }

     public async Task InvokeAsync(HttpContext context)
     {
         var originalBodyStream = context. Response. Body;

         using (var responseBody = new MemoryStream())
         {
             context.Response.Body = responseBody;

             await_next(context);

             if (context. Response. StatusCode >= 400 && context. Response. StatusCode <= 599)
             {
                 context.Response.ContentType = "application/json";

                 var response = new ApiResponse
                 {
                     Success = false,
                     Message = GetStatusCodeMessage(context. Response. StatusCode),
                     Data = await GetResponseData(context. Response)
                 };

                 var jsonResponse = JsonConvert. SerializeObject(response);
                 await context.Response.WriteAsync(jsonResponse, Encoding.UTF8);
             }
             else
             {
                 context.Response.ContentType = "application/json";

                 var response = new ApiResponse
                 {
                     Success = true,
                     Message = GetStatusCodeMessage(context. Response. StatusCode),
                     Data = await GetResponseData(context. Response)
                 };

                 var jsonResponse = JsonConvert. SerializeObject(response);
                 await context.Response.WriteAsync(jsonResponse, Encoding.UTF8);
             }

             await responseBody.CopyToAsync(originalBodyStream);
         }
     }
 }

 

GetStatusCodeMessage()

 private static string GetStatusCodeMessage(int statusCode)
     {
         switch (statusCode)
         {
             case 200:
                 return "OK";
             case 201:
                 return "Created";
             case 204:
                 return "No Content";
             case 400:
                 return "Bad Request";case 401:
                 return "Unauthorized";
             case 403:
                 return "Forbidden";
             case 404:
                 return "Not Found";
             case 500:
                 return "Internal Server Error";
             default:
                 return "Unknown Status Code";
         }
     }
 

GetResponseData()

private async Task GetResponseData(HttpResponse response)
     {
         var body = await new StreamReader(response.Body).ReadToEndAsync();
         response.Body.Seek(0, SeekOrigin.Begin);

         try
         {
             return JsonConvert. DeserializeObject(body);
         }
         catch (JsonReaderException)
         {
             return new { Message = body };
         }
     }
 

In the example above, we created a middleware called CustomResponseMiddleware. This middleware intercepts each response and modifies the response format as needed. Specifically, if the status code of the response is 4xx or 5xx, the middleware will return an ApiResponse object containing an error message and data; otherwise, the middleware will return an ApiResponse object containing a success message and data.

Common categories

Defining commonly used classes can help us standardize the response format in ASP.NET Core applications, improve code reusability, and make it easier for the front end to handle all responses.

In addition to the ApiResponse class, you can also define other common classes, such as the ApiError class, ApiResponse generic class, etc., to meet different needs. For example, the ApiError class can be used to standardize the format of error responses in an application, and the ApiResponse generic class can be used to include more specific data types in the response.

Here is a sample code for the ApiError class:

public class ApiError
 {
     public int StatusCode { get; set; }
     public string Message { get; set; }

     public override string ToString()
     {
         return JsonConvert.SerializeObject(this);
     }
 }

 

The

ApiError class contains two properties: StatusCode and Message. The StatusCode attribute indicates the status code of the error, and the Message attribute contains a message about the error.

Using the ApiError class can help us standardize the format of error responses in our application. For example, in some cases we may need to return a response containing a single error message, while in other cases we may need to return a response containing multiple error messages. By using the ApiError class, we can handle these situations uniformly in the application and return a standard error response format.

Conclusion

By using ASP.NET Core middleware and common classes, we can customize the response format in the ASP.NET Core application and standardize the response format in the application. This improves code reuse and makes it easier for the front end to handle all responses. When developing ASP.NET Core applications, we should always consider using middleware and common classes to improve code readability, maintainability, and reusability.

This article is from the internet and does not represent1024programmerPosition, please indicate the source when reprinting:https://www.1024programmer.com/middleware-for-net-core-custom-specification-responses/

author: admin

Previous article
Next article

Leave a Reply

Your email address will not be published. Required fields are marked *

The latest and most comprehensive programming knowledge, all in 1024programmer.com

© 2023 1024programmer - Encyclopedia of Programming Field
Contact Us

Contact us

181-3619-1160

Online consultation: QQ交谈

E-mail: [email protected]

Working hours: Monday to Friday, 9:00-17:30, holidays off

Follow wechat
Scan wechat and follow us

Scan wechat and follow us