mirror of https://github.com/fafhrd91/actix-web
docs(middleware): complete middleware author's guide
Add comprehensive documentation for middleware development in Actix Web, including: - Detailed explanation of middleware concepts and execution flow - Clear description of middleware traits and their responsibilities - Guidelines for body type handling - Best practices for middleware development - Error handling recommendations - Usage scenarios and anti-patterns
This commit is contained in:
parent
5e0f56f572
commit
e247c3bcc4
|
@ -2,16 +2,80 @@
|
||||||
|
|
||||||
## What Is A Middleware?
|
## What Is A Middleware?
|
||||||
|
|
||||||
|
Middleware in Actix Web is a powerful mechanism that allows you to add additional behavior to request/response processing. It enables you to:
|
||||||
|
|
||||||
|
- Pre-process incoming requests (e.g., path normalization, authentication)
|
||||||
|
- Post-process outgoing responses (e.g., logging, compression)
|
||||||
|
- Modify application state through ServiceRequest
|
||||||
|
- Access external services (e.g., sessions, caching)
|
||||||
|
|
||||||
|
Middleware is registered for each App, Scope, or Resource and executed in the reverse order of registration. This means the last registered middleware is the first to process the request.
|
||||||
|
|
||||||
## Middleware Traits
|
## Middleware Traits
|
||||||
|
|
||||||
|
Actix Web's middleware system is built on two main traits:
|
||||||
|
|
||||||
|
1. `Transform<S, Req>`: The builder trait that creates the actual Service. It's responsible for:
|
||||||
|
|
||||||
|
- Creating new middleware instances
|
||||||
|
- Assembling the middleware chain
|
||||||
|
- Handling initialization errors
|
||||||
|
|
||||||
|
2. `Service<Req>`: The trait that represents the actual middleware functionality. It:
|
||||||
|
- Processes requests and responses
|
||||||
|
- Can modify both request and response
|
||||||
|
- Can short-circuit request processing
|
||||||
|
- Must be implemented for the middleware to work
|
||||||
|
|
||||||
## Understanding Body Types
|
## Understanding Body Types
|
||||||
|
|
||||||
|
When working with middleware, it's important to understand body types:
|
||||||
|
|
||||||
|
- Middleware can work with different body types for requests and responses
|
||||||
|
- The `MessageBody` trait is used to handle different body types
|
||||||
|
- You can use `EitherBody` when you need to handle multiple body types
|
||||||
|
- Be careful with body consumption - once a body is consumed, it cannot be read again
|
||||||
|
|
||||||
## Best Practices
|
## Best Practices
|
||||||
|
|
||||||
|
1. Keep middleware focused and single-purpose
|
||||||
|
2. Handle errors appropriately and propagate them correctly
|
||||||
|
3. Be mindful of performance impact
|
||||||
|
4. Use appropriate body types and handle them correctly
|
||||||
|
5. Consider middleware ordering carefully
|
||||||
|
6. Document your middleware's behavior and requirements
|
||||||
|
7. Test your middleware thoroughly
|
||||||
|
|
||||||
## Error Propagation
|
## Error Propagation
|
||||||
|
|
||||||
|
Proper error handling is crucial in middleware:
|
||||||
|
|
||||||
|
1. Always propagate errors from the inner service
|
||||||
|
2. Use appropriate error types
|
||||||
|
3. Handle initialization errors
|
||||||
|
4. Consider using custom error types for specific middleware errors
|
||||||
|
5. Document error conditions and handling
|
||||||
|
|
||||||
## When To (Not) Use Middleware
|
## When To (Not) Use Middleware
|
||||||
|
|
||||||
|
Use middleware when you need to:
|
||||||
|
|
||||||
|
- Add cross-cutting concerns
|
||||||
|
- Modify requests/responses globally
|
||||||
|
- Add authentication/authorization
|
||||||
|
- Add logging or monitoring
|
||||||
|
- Handle compression or caching
|
||||||
|
|
||||||
|
Avoid middleware when:
|
||||||
|
|
||||||
|
- The functionality is specific to a single route
|
||||||
|
- The operation is better handled by a service
|
||||||
|
- The overhead would be too high
|
||||||
|
- The functionality can be implemented more simply
|
||||||
|
|
||||||
## Author's References
|
## Author's References
|
||||||
|
|
||||||
- `EitherBody` + when is middleware appropriate: https://discord.com/channels/771444961383153695/952016890723729428
|
- `EitherBody` + when is middleware appropriate: https://discord.com/channels/771444961383153695/952016890723729428
|
||||||
|
- Actix Web Documentation: https://docs.rs/actix-web
|
||||||
|
- Service Trait Documentation: https://docs.rs/actix-service
|
||||||
|
- MessageBody Trait Documentation: https://docs.rs/actix-web/latest/actix_web/body/trait.MessageBody.html
|
||||||
|
|
Loading…
Reference in New Issue