http_interceptor是否支持直接返回客户端响应而不请求服务器?
使用http_interceptor实现本地Mock响应(绕过服务器请求)
http_interceptor完全支持这种本地Mock响应、绕过服务器请求的需求,核心思路是通过自定义拦截器,在请求阶段直接返回构造好的响应数据,终止后续的请求发送流程。
实现步骤与代码示例
- 自定义Mock拦截器
继承InterceptorContract,重写interceptRequest方法,通过抛出HttpResponseException并携带自定义的ResponseData来直接返回Mock响应:
import 'package:http_interceptor/http_interceptor.dart'; class MockInterceptor extends InterceptorContract { @override Future<RequestData> interceptRequest({required RequestData data}) async { // 构造Mock响应,直接终止请求链 throw HttpResponseException( ResponseData( data: {'message': 'Mock response'}, statusCode: 200, headers: {}, ), ); } @override Future<ResponseData> interceptResponse({required ResponseData data}) async { // 响应拦截无需修改,直接返回原数据 return data; } }
- 配置并使用拦截器
通过HttpWithInterceptor.build创建带有Mock拦截器的HTTP客户端,发起请求时会直接返回Mock响应:
final httpClient = HttpWithInterceptor.build( interceptors: [MockInterceptor()], baseUrl: 'https://your-base-domain.com', ); // 发起请求示例 try { final response = await httpClient.get('/test-endpoint'); } on HttpResponseException catch (e) { // 获取Mock响应数据 final mockResponse = e.response; print(mockResponse.data); // 输出: {'message': 'Mock response'} print(mockResponse.statusCode); // 输出: 200 }
针对特定接口返回不同Mock数据
如果需要根据请求路径、方法或参数返回不同的Mock响应,可以在interceptRequest中添加判断逻辑:
@override Future<RequestData> interceptRequest({required RequestData data}) async { // 根据请求路径返回对应Mock数据 switch (data.url.path) { case '/user/profile': throw HttpResponseException( ResponseData( data: {'id': 101, 'username': 'mock_user', 'email': 'mock@example.com'}, statusCode: 200, headers: {}, ), ); case '/posts': throw HttpResponseException( ResponseData( data: [ {'id': 1, 'title': 'First Mock Post', 'content': 'Mock content here'}, {'id': 2, 'title': 'Second Mock Post', 'content': 'Another mock content'} ], statusCode: 200, headers: {}, ), ); default: // 未匹配的请求继续发送到服务器(可选,也可以统一返回默认Mock) return data; } }
原理说明
通过在请求拦截阶段抛出HttpResponseException,http_interceptor会终止后续的请求发送流程,直接将异常中携带的ResponseData作为请求结果返回,从而完全绕过服务器,实现客户端本地Mock响应的效果,和你提供的Dio实现逻辑一致,只是API形式略有不同。
内容的提问来源于stack exchange,提问作者krishnaji
相关产品推荐
相关产品推荐

