You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:00:32