使用 dio 在 headers 中使用 apikey 授权,并通过 openapi-generator-dart 生成客户端库

Authorization with apikey in headers using dio and generated client libraries by openapi-generator-dart

我使用来自 openapi-generator-dart 的 DioNext 生成器在 flutter 项目中创建了客户端库。 我尝试与之通信的 api 使用 api 密钥作为身份验证方法,并在 url 中使用它,即当我通过 api 访问 api 时=31=] Chrome 浏览器: https://api.hotelsexample.com/hotelfinder/v1/countries/en_US/hotels/A000293?apikey=9dhsu8d8-an9c-d40e1-a11c-5s84ddewda5

现在DioNext生成的获取酒店的方法如下所示,这样的端点有很多,所以我不想更改生成的代码:

  Future<Response<Hotel>> hotelGET({ 
    required String countryId,
    required String hotelId,
    BuiltList<String>? fieldsFilter,
    CancelToken? cancelToken,
    Map<String, dynamic>? headers,
    Map<String, dynamic>? extra,
    ValidateStatus? validateStatus,
    ProgressCallback? onSendProgress,
    ProgressCallback? onReceiveProgress,
  }) async {
    final _path = r'/countries/{countryId}/hotels/{hotelId}'.replaceAll('{' r'countryId' '}', countryId.toString()).replaceAll('{' r'hotelId' '}', hotelId.toString());
    final _options = Options(
      method: r'GET',
      headers: <String, dynamic>{
        ...?headers,
      },
      extra: <String, dynamic>{
        'secure': <Map<String, String>>[
          {
            'type': 'apiKey',
            'name': 'apikey',
            'keyName': 'apikey',
            'where': 'query',
          },
        ],
        ...?extra,
      },
      validateStatus: validateStatus,
    );

    final _queryParameters = <String, dynamic>{
      if (fieldsFilter != null) r'fieldsFilter': encodeCollectionQueryParameter<String>(_serializers, fieldsFilter, const FullType(BuiltList, [FullType(String)]), format: ListFormat.multi,),
    };

    final _response = await _dio.request<Object>(
      _path,
      options: _options,
      queryParameters: _queryParameters,
      cancelToken: cancelToken,
      onSendProgress: onSendProgress,
      onReceiveProgress: onReceiveProgress,
    );

    Hotel _responseData;

    try {
      const _responseType = FullType(Hotel);
      _responseData = _serializers.deserialize(
        _response.data!,
        specifiedType: _responseType,
      ) as Hotel;

    } catch (error, stackTrace) {
      throw DioError(
        requestOptions: _response.requestOptions,
        response: _response,
        type: DioErrorType.other,
        error: error,
      )..stackTrace = stackTrace;
    }

    return Response<Hotel>(
      data: _responseData,
      headers: _response.headers,
      isRedirect: _response.isRedirect,
      requestOptions: _response.requestOptions,
      redirects: _response.redirects,
      statusCode: _response.statusCode,
      statusMessage: _response.statusMessage,
      extra: _response.extra,
    );
  }

现在,当我尝试使用以下方法调用 api 时:

void getmyhotel() async {
    final api = Hotelsexample().getReferencesApi();
    final countryId = "en_US";
    final hotelId = "A000293";

    try {
      final response = await api.hotelGET(
          countryId: countryId,
          hotelId: hotelId,
          headers: {"apikey": "9dhsu8d8-an9c-d40e1-a11c-5s84ddewda5"});
      print(answer);
    } catch (e) {
      print(
          "Exception: $e\n");
    }
  }

我收到无效 api 密钥的错误,因此 api 服务器无法识别 api 密钥。 我必须在我的代码中的什么地方放置 api 键?

非常感谢!

您必须将其作为查询传递,而不是 header。

好的,我解决了这个问题。 这次我下载了最新版本的https://github.com/OpenAPITools/openapi-generator。 它是一个 .jar 文件。我使用 github 页面上的说明从 .jar 文件中生成文件,现在我有了客户端库,它们已升级到空安全并且不需要使用 dio。 用代码

defaultApiClient.getAuthentication<ApiKeyAuth>("apikey")!.apiKey =
        "9dhsu8d8-an9c-d40e1-a11c-5s84ddewda5";

我现在可以传递apikey了!