如何在Dart-Dio OpenAPI生成代码中全局设置API Key?
OpenAPI Dart-Dio生成器全局设置API Key的正确方式
问题场景
使用openapi-generator-cli的dart-dio生成器创建API后,接口要求携带apikey请求头才能访问。目前每次调用时手动在headers参数传入{'apikey': 'ABC123'}能正常获取数据,但尝试以下全局设置方式均无效:
- 直接调用
setApiKey后获取API实例
Openapi().setApiKey('apikey', 'ABC123'); final api = Openapi().getMakesApi(); future: api.apiListitemsMakessGet();
- 先实例化
Openapi再设置ApiKey
final apiClient = Openapi(); apiClient.setApiKey('apikey', 'ABC123'); final api = apiClient.getMakesApi(); future: api.apiListitemsMakessGet();
- 添加自定义
ApiKeyAuthInterceptor
ApiKeyAuthInterceptor apiKeyAuthInterceptor = ApiKeyAuthInterceptor(); apiKeyAuthInterceptor.apiKeys.addAll({'apikey': 'ABC123'}); var a = Openapi(); a.dio.interceptors.add(apiKeyAuthInterceptor); final api = a.getMakesApi(); future: api.apiListitemsMakessGet();
正确的全局设置方法
方法1:设置Openapi实例的defaultHeaders
dart-dio生成器生成的Openapi类自带defaultHeaders属性,直接赋值即可全局添加请求头:
final openapi = Openapi(); openapi.defaultHeaders['apikey'] = 'ABC123'; final api = openapi.getMakesApi(); future: api.apiListitemsMakessGet();
方法2:修改Dio实例的默认请求头
直接操作Openapi关联的Dio对象,设置其默认headers:
final openapi = Openapi(); openapi.dio.options.headers['apikey'] = 'ABC123'; final api = openapi.getMakesApi(); future: api.apiListitemsMakessGet();
方法3:配置生成的ApiKeyAuth实例
如果生成的代码包含ApiKeyAuth类(通常是生成器自动创建的授权管理类),需要找到对应实例设置参数:
final openapi = Openapi(); // 找到生成的apiKeyAuth实例,设置密钥 openapi.apiKeyAuth?.apiKey = 'ABC123'; // 明确指定密钥位置为header(默认可能是query参数) openapi.apiKeyAuth?.location = 'header'; final api = openapi.getMakesApi(); future: api.apiListitemsMakessGet();
方法4:自定义全局拦截器(通用兜底方案)
如果以上方法都不生效,自己实现一个简单的Dio拦截器强制添加请求头:
class ApiKeyInterceptor extends Interceptor { final String apiKey; ApiKeyInterceptor(this.apiKey); @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { options.headers['apikey'] = apiKey; super.onRequest(options, handler); } } // 使用拦截器 final openapi = Openapi(); openapi.dio.interceptors.add(ApiKeyInterceptor('ABC123')); final api = openapi.getMakesApi(); future: api.apiListitemsMakessGet();
内容的提问来源于stack exchange,提问作者Molloch
相关产品推荐
相关产品推荐

