Я использую кодовый код swagger для своих вызовов REST API.В целях аутентификации мне нужно отправить токен сеанса в заголовках каждого запроса.В настоящее время это делается через APIClients 'defaultHeaders
open class ApiClient(val baseUrl: String) {
companion object {
...
@JvmStatic
var defaultHeaders: Map<String, String> by ApplicationDelegates.setOnce(mapOf(ContentType to JsonMediaType, Accept to JsonMediaType))
...
}
}
. Способ, которым swagger генерирует код, эти заголовки могут быть изменены только один раз.
ApiClient.defaultHeaders += mapOf("Authorization" to userSession!!.idToken.jwtToken)
Проблема в том,что я не могу изменить токен (например, потому что другой пользователь вошел в систему в течение времени жизни приложения).Если заглянуть глубже в сгенерированный код, перед отправкой каждого запроса выполняется объединение defaultHeaders
и requestConfig.headers
(= contentHeaders
).
inline protected fun <reified T: Any?> request(requestConfig: RequestConfig, body : Any? = null): ApiInfrastructureResponse<T?> {
...
val headers = defaultHeaders + requestConfig.headers
...
}
Данный объект RequestConfig
приходитс каждого вызова API.Однако изменить эти contentHeaders
невозможно.Также они по умолчанию пусты.
fun someAPIRestCall(someParam: kotlin.String) : Unit {
val localVariableBody: kotlin.Any? = type
val localVariableQuery: MultiValueMap = mapOf()
val contentHeaders: kotlin.collections.Map<kotlin.String,kotlin.String> = mapOf() // THESE WILL BE MERGED WITH defaultHeaders
val acceptsHeaders: kotlin.collections.Map<kotlin.String,kotlin.String> = mapOf("Accept" to "application/json")
val localVariableHeaders: kotlin.collections.MutableMap<kotlin.String,kotlin.String> = mutableMapOf()
localVariableHeaders.putAll(contentHeaders)
localVariableHeaders.putAll(acceptsHeaders)
val localVariableConfig = RequestConfig(
RequestMethod.POST,
"someEndpointURL"),
query = localVariableQuery,
headers = localVariableHeaders // THESE WILL BE MERGED WITH defaultHeaders
)
val response = request<Unit>(
localVariableConfig,
localVariableBody
)
...
}
Можно ли сказать swagger-codegen включить какой-либо параметр в сгенерированную сигнатуру метода для добавления значений к этим contentHeaders
?
РЕДАКТИРОВАТЬ:
Это текущий вызов кода в моей цепочке сборки Gradle
task generateSwagger(type: JavaExec) {
main = "-jar"
args "swagger-codegen-cli-2.4.7.jar", "generate", "-i", "./swagger_core.yml", "-l", "kotlin", "-o", "./tmp/RestApi", "--type-mappings", "number=kotlin.Long"
}