使用 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了!
我使用来自 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了!