mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-07-06 07:31:01 +00:00
[Kotlin][client] fix file upload (#5548)
* [kotlin] fix file upload * [kotlin] fix file upload * [kotlin] fix file upload * [kotlin][client] fix jackson integration * [kotlin] fix file upload * [kotlin] fix file upload
This commit is contained in:
parent
ce8cdcdf25
commit
f402126460
@ -32,7 +32,7 @@ import {{packageName}}.infrastructure.toMultiValue
|
|||||||
@Suppress("UNCHECKED_CAST"){{/returnType}}
|
@Suppress("UNCHECKED_CAST"){{/returnType}}
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun {{operationId}}({{#allParams}}{{{paramName}}}: {{{dataType}}}{{^required}}?{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) : {{#returnType}}{{{returnType}}}{{#nullableReturnType}}?{{/nullableReturnType}}{{/returnType}}{{^returnType}}Unit{{/returnType}} {
|
fun {{operationId}}({{#allParams}}{{{paramName}}}: {{{dataType}}}{{^required}}?{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) : {{#returnType}}{{{returnType}}}{{#nullableReturnType}}?{{/nullableReturnType}}{{/returnType}}{{^returnType}}Unit{{/returnType}} {
|
||||||
val localVariableBody: kotlin.Any? = {{#hasBodyParam}}{{#bodyParams}}{{{paramName}}}{{/bodyParams}}{{/hasBodyParam}}{{^hasBodyParam}}{{^hasFormParams}}null{{/hasFormParams}}{{#hasFormParams}}mapOf({{#formParams}}"{{{baseName}}}" to "${{{paramName}}}"{{#hasMore}}, {{/hasMore}}{{/formParams}}){{/hasFormParams}}{{/hasBodyParam}}
|
val localVariableBody: kotlin.Any? = {{#hasBodyParam}}{{#bodyParams}}{{{paramName}}}{{/bodyParams}}{{/hasBodyParam}}{{^hasBodyParam}}{{^hasFormParams}}null{{/hasFormParams}}{{#hasFormParams}}mapOf({{#formParams}}"{{{baseName}}}" to {{{paramName}}}{{#hasMore}}, {{/hasMore}}{{/formParams}}){{/hasFormParams}}{{/hasBodyParam}}
|
||||||
val localVariableQuery: MultiValueMap = {{^hasQueryParams}}mutableMapOf()
|
val localVariableQuery: MultiValueMap = {{^hasQueryParams}}mutableMapOf()
|
||||||
{{/hasQueryParams}}{{#hasQueryParams}}mutableMapOf<kotlin.String, List<kotlin.String>>()
|
{{/hasQueryParams}}{{#hasQueryParams}}mutableMapOf<kotlin.String, List<kotlin.String>>()
|
||||||
.apply {
|
.apply {
|
||||||
@ -55,7 +55,7 @@ import {{packageName}}.infrastructure.toMultiValue
|
|||||||
{{/queryParams}}
|
{{/queryParams}}
|
||||||
}
|
}
|
||||||
{{/hasQueryParams}}
|
{{/hasQueryParams}}
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf({{#hasFormParams}}"Content-Type" to {{^consumes}}"multipart/form-data"{{/consumes}}{{#consumes.0}}"{{MediaType}}"{{/consumes.0}}{{/hasFormParams}}{{^hasHeaderParams}}){{/hasHeaderParams}}{{#hasHeaderParams}}{{#hasFormParams}}, {{/hasFormParams}}{{#headerParams}}"{{baseName}}" to {{#isContainer}}{{{paramName}}}.joinToString(separator = collectionDelimiter("{{collectionFormat}}")){{/isContainer}}{{^isContainer}}{{{paramName}}}.toString(){{/isContainer}}{{#hasMore}}, {{/hasMore}}{{/headerParams}}){{/hasHeaderParams}}
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf({{#hasFormParams}}"Content-Type" to {{^consumes}}"multipart/form-data"{{/consumes}}{{#consumes.0}}"{{{mediaType}}}"{{/consumes.0}}{{/hasFormParams}}{{^hasHeaderParams}}){{/hasHeaderParams}}{{#hasHeaderParams}}{{#hasFormParams}}, {{/hasFormParams}}{{#headerParams}}"{{baseName}}" to {{#isContainer}}{{{paramName}}}.joinToString(separator = collectionDelimiter("{{collectionFormat}}")){{/isContainer}}{{^isContainer}}{{{paramName}}}.toString(){{/isContainer}}{{#hasMore}}, {{/hasMore}}{{/headerParams}}){{/hasHeaderParams}}
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.{{httpMethod}},
|
RequestMethod.{{httpMethod}},
|
||||||
"{{path}}"{{#pathParams}}.replace("{"+"{{baseName}}"+"}", "${{{paramName}}}"){{/pathParams}},
|
"{{path}}"{{#pathParams}}.replace("{"+"{{baseName}}"+"}", "${{{paramName}}}"){{/pathParams}},
|
||||||
|
@ -22,7 +22,25 @@ import okhttp3.ResponseBody
|
|||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
{{/jvm-okhttp4}}
|
{{/jvm-okhttp4}}
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.MultipartBody
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.URLConnection
|
||||||
|
import java.util.Date
|
||||||
|
{{^threetenbp}}
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.LocalTime
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.OffsetTime
|
||||||
|
{{/threetenbp}}
|
||||||
|
{{#threetenbp}}
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
|
import org.threeten.bp.LocalDateTime
|
||||||
|
import org.threeten.bp.LocalTime
|
||||||
|
import org.threeten.bp.OffsetDateTime
|
||||||
|
import org.threeten.bp.OffsetTime
|
||||||
|
{{/threetenbp}}
|
||||||
|
|
||||||
{{#nonPublicApi}}internal {{/nonPublicApi}}open class ApiClient(val baseUrl: String) {
|
{{#nonPublicApi}}internal {{/nonPublicApi}}open class ApiClient(val baseUrl: String) {
|
||||||
{{#nonPublicApi}}internal {{/nonPublicApi}}companion object {
|
{{#nonPublicApi}}internal {{/nonPublicApi}}companion object {
|
||||||
@ -49,6 +67,17 @@ import java.io.File
|
|||||||
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess Content-Type header from the given file (defaults to "application/octet-stream").
|
||||||
|
*
|
||||||
|
* @param file The given file
|
||||||
|
* @return The guessed Content-Type
|
||||||
|
*/
|
||||||
|
protected fun guessContentTypeFromFile(file: File): String {
|
||||||
|
val contentType = URLConnection.guessContentTypeFromName(file.name)
|
||||||
|
return contentType ?: "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
||||||
when {
|
when {
|
||||||
{{#jvm-okhttp3}}
|
{{#jvm-okhttp3}}
|
||||||
@ -61,12 +90,50 @@ import java.io.File
|
|||||||
mediaType.toMediaTypeOrNull()
|
mediaType.toMediaTypeOrNull()
|
||||||
)
|
)
|
||||||
{{/jvm-okhttp4}}
|
{{/jvm-okhttp4}}
|
||||||
mediaType == FormDataMediaType || mediaType == FormUrlEncMediaType -> {
|
mediaType == FormDataMediaType -> {
|
||||||
|
MultipartBody.Builder()
|
||||||
|
.setType(MultipartBody.FORM)
|
||||||
|
.apply {
|
||||||
|
// content's type *must* be Map<String, Any?>
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
|
if (value is File) {
|
||||||
|
val partHeaders = Headers.{{#jvm-okhttp3}}of{{/jvm-okhttp3}}{{#jvm-okhttp4}}headersOf{{/jvm-okhttp4}}(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\"; filename=\"${value.name}\""
|
||||||
|
)
|
||||||
|
{{#jvm-okhttp3}}
|
||||||
|
val fileMediaType = MediaType.parse(guessContentTypeFromFile(value))
|
||||||
|
addPart(partHeaders, RequestBody.create(fileMediaType, value))
|
||||||
|
{{/jvm-okhttp3}}
|
||||||
|
{{#jvm-okhttp4}}
|
||||||
|
val fileMediaType = guessContentTypeFromFile(value).toMediaTypeOrNull()
|
||||||
|
addPart(partHeaders, value.asRequestBody(fileMediaType))
|
||||||
|
{{/jvm-okhttp4}}
|
||||||
|
} else {
|
||||||
|
val partHeaders = Headers.{{#jvm-okhttp3}}of{{/jvm-okhttp3}}{{#jvm-okhttp4}}headersOf{{/jvm-okhttp4}}(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\""
|
||||||
|
)
|
||||||
|
addPart(
|
||||||
|
partHeaders,
|
||||||
|
{{#jvm-okhttp3}}
|
||||||
|
RequestBody.create(null, parameterToString(value))
|
||||||
|
{{/jvm-okhttp3}}
|
||||||
|
{{#jvm-okhttp4}}
|
||||||
|
parameterToString(value).toRequestBody(null)
|
||||||
|
{{/jvm-okhttp4}}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
mediaType == FormUrlEncMediaType -> {
|
||||||
FormBody.Builder().apply {
|
FormBody.Builder().apply {
|
||||||
// content's type *must* be Map<String, Any>
|
// content's type *must* be Map<String, Any?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
(content as Map<String,String>).forEach { (key, value) ->
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
add(key, value)
|
add(key, parameterToString(value))
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@ -79,7 +146,7 @@ import java.io.File
|
|||||||
MediaType.parse(mediaType), Serializer.gson.toJson(content, T::class.java)
|
MediaType.parse(mediaType), Serializer.gson.toJson(content, T::class.java)
|
||||||
{{/gson}}
|
{{/gson}}
|
||||||
{{#jackson}}
|
{{#jackson}}
|
||||||
MediaType.parse(mediaType), Serializer.jackson.toJson(content, T::class.java)
|
MediaType.parse(mediaType), Serializer.jacksonObjectMapper.writeValueAsString(content)
|
||||||
{{/jackson}}
|
{{/jackson}}
|
||||||
)
|
)
|
||||||
{{/jvm-okhttp3}}
|
{{/jvm-okhttp3}}
|
||||||
@ -254,7 +321,26 @@ import java.io.File
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{{^jackson}}
|
protected fun parameterToString(value: Any?): String {
|
||||||
|
when (value) {
|
||||||
|
null -> {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
is Array<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is Iterable<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime, is Date -> {
|
||||||
|
return parseDateToQueryString<Any>(value)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
||||||
{{#toJson}}
|
{{#toJson}}
|
||||||
/*
|
/*
|
||||||
@ -269,10 +355,12 @@ import java.io.File
|
|||||||
{{#gson}}
|
{{#gson}}
|
||||||
return Serializer.gson.toJson(value, T::class.java).replace("\"", "")
|
return Serializer.gson.toJson(value, T::class.java).replace("\"", "")
|
||||||
{{/gson}}
|
{{/gson}}
|
||||||
|
{{#jackson}}
|
||||||
|
return Serializer.jacksonObjectMapper.writeValueAsString(value).replace("\"", "")
|
||||||
|
{{/jackson}}
|
||||||
{{/toJson}}
|
{{/toJson}}
|
||||||
{{^toJson}}
|
{{^toJson}}
|
||||||
return value.toString()
|
return value.toString()
|
||||||
{{/toJson}}
|
{{/toJson}}
|
||||||
}
|
}
|
||||||
{{/jackson}}
|
|
||||||
}
|
}
|
||||||
|
@ -291,9 +291,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
*/
|
*/
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("name" to "$name", "status" to "$status")
|
val localVariableBody: kotlin.Any? = mapOf("name" to name, "status" to status)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "application/x-www-form-urlencoded")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
||||||
@ -334,9 +334,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to "$additionalMetadata", "file" to "$file")
|
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to additionalMetadata, "file" to file)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "multipart/form-data")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
||||||
|
@ -10,7 +10,16 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|||||||
import okhttp3.ResponseBody
|
import okhttp3.ResponseBody
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.MultipartBody
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.URLConnection
|
||||||
|
import java.util.Date
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.LocalTime
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.OffsetTime
|
||||||
|
|
||||||
open class ApiClient(val baseUrl: String) {
|
open class ApiClient(val baseUrl: String) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -37,17 +46,55 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess Content-Type header from the given file (defaults to "application/octet-stream").
|
||||||
|
*
|
||||||
|
* @param file The given file
|
||||||
|
* @return The guessed Content-Type
|
||||||
|
*/
|
||||||
|
protected fun guessContentTypeFromFile(file: File): String {
|
||||||
|
val contentType = URLConnection.guessContentTypeFromName(file.name)
|
||||||
|
return contentType ?: "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
||||||
when {
|
when {
|
||||||
content is File -> content.asRequestBody(
|
content is File -> content.asRequestBody(
|
||||||
mediaType.toMediaTypeOrNull()
|
mediaType.toMediaTypeOrNull()
|
||||||
)
|
)
|
||||||
mediaType == FormDataMediaType || mediaType == FormUrlEncMediaType -> {
|
mediaType == FormDataMediaType -> {
|
||||||
|
MultipartBody.Builder()
|
||||||
|
.setType(MultipartBody.FORM)
|
||||||
|
.apply {
|
||||||
|
// content's type *must* be Map<String, Any?>
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
|
if (value is File) {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\"; filename=\"${value.name}\""
|
||||||
|
)
|
||||||
|
val fileMediaType = guessContentTypeFromFile(value).toMediaTypeOrNull()
|
||||||
|
addPart(partHeaders, value.asRequestBody(fileMediaType))
|
||||||
|
} else {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\""
|
||||||
|
)
|
||||||
|
addPart(
|
||||||
|
partHeaders,
|
||||||
|
parameterToString(value).toRequestBody(null)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
mediaType == FormUrlEncMediaType -> {
|
||||||
FormBody.Builder().apply {
|
FormBody.Builder().apply {
|
||||||
// content's type *must* be Map<String, Any>
|
// content's type *must* be Map<String, Any?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
(content as Map<String,String>).forEach { (key, value) ->
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
add(key, value)
|
add(key, parameterToString(value))
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@ -172,6 +219,26 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun parameterToString(value: Any?): String {
|
||||||
|
when (value) {
|
||||||
|
null -> {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
is Array<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is Iterable<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime, is Date -> {
|
||||||
|
return parseDateToQueryString<Any>(value)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
||||||
/*
|
/*
|
||||||
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
||||||
|
@ -291,9 +291,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
*/
|
*/
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("name" to "$name", "status" to "$status")
|
val localVariableBody: kotlin.Any? = mapOf("name" to name, "status" to status)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "application/x-www-form-urlencoded")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
||||||
@ -334,9 +334,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to "$additionalMetadata", "file" to "$file")
|
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to additionalMetadata, "file" to file)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "multipart/form-data")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
||||||
|
@ -10,7 +10,16 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|||||||
import okhttp3.ResponseBody
|
import okhttp3.ResponseBody
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.MultipartBody
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.URLConnection
|
||||||
|
import java.util.Date
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.LocalTime
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.OffsetTime
|
||||||
|
|
||||||
open class ApiClient(val baseUrl: String) {
|
open class ApiClient(val baseUrl: String) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -37,17 +46,55 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess Content-Type header from the given file (defaults to "application/octet-stream").
|
||||||
|
*
|
||||||
|
* @param file The given file
|
||||||
|
* @return The guessed Content-Type
|
||||||
|
*/
|
||||||
|
protected fun guessContentTypeFromFile(file: File): String {
|
||||||
|
val contentType = URLConnection.guessContentTypeFromName(file.name)
|
||||||
|
return contentType ?: "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
||||||
when {
|
when {
|
||||||
content is File -> content.asRequestBody(
|
content is File -> content.asRequestBody(
|
||||||
mediaType.toMediaTypeOrNull()
|
mediaType.toMediaTypeOrNull()
|
||||||
)
|
)
|
||||||
mediaType == FormDataMediaType || mediaType == FormUrlEncMediaType -> {
|
mediaType == FormDataMediaType -> {
|
||||||
|
MultipartBody.Builder()
|
||||||
|
.setType(MultipartBody.FORM)
|
||||||
|
.apply {
|
||||||
|
// content's type *must* be Map<String, Any?>
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
|
if (value is File) {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\"; filename=\"${value.name}\""
|
||||||
|
)
|
||||||
|
val fileMediaType = guessContentTypeFromFile(value).toMediaTypeOrNull()
|
||||||
|
addPart(partHeaders, value.asRequestBody(fileMediaType))
|
||||||
|
} else {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\""
|
||||||
|
)
|
||||||
|
addPart(
|
||||||
|
partHeaders,
|
||||||
|
parameterToString(value).toRequestBody(null)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
mediaType == FormUrlEncMediaType -> {
|
||||||
FormBody.Builder().apply {
|
FormBody.Builder().apply {
|
||||||
// content's type *must* be Map<String, Any>
|
// content's type *must* be Map<String, Any?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
(content as Map<String,String>).forEach { (key, value) ->
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
add(key, value)
|
add(key, parameterToString(value))
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@ -172,4 +219,33 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun parameterToString(value: Any?): String {
|
||||||
|
when (value) {
|
||||||
|
null -> {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
is Array<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is Iterable<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime, is Date -> {
|
||||||
|
return parseDateToQueryString<Any>(value)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
||||||
|
/*
|
||||||
|
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
||||||
|
The moshi or gson adapter allows a more generic solution instead of trying to use a native
|
||||||
|
formatter. It also easily allows to provide a simple way to define a custom date format pattern
|
||||||
|
inside a gson/moshi adapter.
|
||||||
|
*/
|
||||||
|
return Serializer.jacksonObjectMapper.writeValueAsString(value).replace("\"", "")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -293,9 +293,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
*/
|
*/
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("name" to "$name", "status" to "$status")
|
val localVariableBody: kotlin.Any? = mapOf("name" to name, "status" to status)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "application/x-www-form-urlencoded")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
||||||
@ -336,9 +336,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to "$additionalMetadata", "file" to "$file")
|
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to additionalMetadata, "file" to file)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "multipart/form-data")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
||||||
|
@ -10,7 +10,16 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|||||||
import okhttp3.ResponseBody
|
import okhttp3.ResponseBody
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.MultipartBody
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.URLConnection
|
||||||
|
import java.util.Date
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.LocalTime
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.OffsetTime
|
||||||
|
|
||||||
open class ApiClient(val baseUrl: String) {
|
open class ApiClient(val baseUrl: String) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -37,17 +46,55 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess Content-Type header from the given file (defaults to "application/octet-stream").
|
||||||
|
*
|
||||||
|
* @param file The given file
|
||||||
|
* @return The guessed Content-Type
|
||||||
|
*/
|
||||||
|
protected fun guessContentTypeFromFile(file: File): String {
|
||||||
|
val contentType = URLConnection.guessContentTypeFromName(file.name)
|
||||||
|
return contentType ?: "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
||||||
when {
|
when {
|
||||||
content is File -> content.asRequestBody(
|
content is File -> content.asRequestBody(
|
||||||
mediaType.toMediaTypeOrNull()
|
mediaType.toMediaTypeOrNull()
|
||||||
)
|
)
|
||||||
mediaType == FormDataMediaType || mediaType == FormUrlEncMediaType -> {
|
mediaType == FormDataMediaType -> {
|
||||||
|
MultipartBody.Builder()
|
||||||
|
.setType(MultipartBody.FORM)
|
||||||
|
.apply {
|
||||||
|
// content's type *must* be Map<String, Any?>
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
|
if (value is File) {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\"; filename=\"${value.name}\""
|
||||||
|
)
|
||||||
|
val fileMediaType = guessContentTypeFromFile(value).toMediaTypeOrNull()
|
||||||
|
addPart(partHeaders, value.asRequestBody(fileMediaType))
|
||||||
|
} else {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\""
|
||||||
|
)
|
||||||
|
addPart(
|
||||||
|
partHeaders,
|
||||||
|
parameterToString(value).toRequestBody(null)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
mediaType == FormUrlEncMediaType -> {
|
||||||
FormBody.Builder().apply {
|
FormBody.Builder().apply {
|
||||||
// content's type *must* be Map<String, Any>
|
// content's type *must* be Map<String, Any?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
(content as Map<String,String>).forEach { (key, value) ->
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
add(key, value)
|
add(key, parameterToString(value))
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@ -172,6 +219,26 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun parameterToString(value: Any?): String {
|
||||||
|
when (value) {
|
||||||
|
null -> {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
is Array<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is Iterable<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime, is Date -> {
|
||||||
|
return parseDateToQueryString<Any>(value)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
||||||
return value.toString()
|
return value.toString()
|
||||||
}
|
}
|
||||||
|
@ -291,9 +291,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
*/
|
*/
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("name" to "$name", "status" to "$status")
|
val localVariableBody: kotlin.Any? = mapOf("name" to name, "status" to status)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "application/x-www-form-urlencoded")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
||||||
@ -334,9 +334,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to "$additionalMetadata", "file" to "$file")
|
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to additionalMetadata, "file" to file)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "multipart/form-data")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
||||||
|
@ -10,7 +10,16 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|||||||
import okhttp3.ResponseBody
|
import okhttp3.ResponseBody
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.MultipartBody
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.URLConnection
|
||||||
|
import java.util.Date
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.LocalTime
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.OffsetTime
|
||||||
|
|
||||||
open class ApiClient(val baseUrl: String) {
|
open class ApiClient(val baseUrl: String) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -37,17 +46,55 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess Content-Type header from the given file (defaults to "application/octet-stream").
|
||||||
|
*
|
||||||
|
* @param file The given file
|
||||||
|
* @return The guessed Content-Type
|
||||||
|
*/
|
||||||
|
protected fun guessContentTypeFromFile(file: File): String {
|
||||||
|
val contentType = URLConnection.guessContentTypeFromName(file.name)
|
||||||
|
return contentType ?: "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
||||||
when {
|
when {
|
||||||
content is File -> content.asRequestBody(
|
content is File -> content.asRequestBody(
|
||||||
mediaType.toMediaTypeOrNull()
|
mediaType.toMediaTypeOrNull()
|
||||||
)
|
)
|
||||||
mediaType == FormDataMediaType || mediaType == FormUrlEncMediaType -> {
|
mediaType == FormDataMediaType -> {
|
||||||
|
MultipartBody.Builder()
|
||||||
|
.setType(MultipartBody.FORM)
|
||||||
|
.apply {
|
||||||
|
// content's type *must* be Map<String, Any?>
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
|
if (value is File) {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\"; filename=\"${value.name}\""
|
||||||
|
)
|
||||||
|
val fileMediaType = guessContentTypeFromFile(value).toMediaTypeOrNull()
|
||||||
|
addPart(partHeaders, value.asRequestBody(fileMediaType))
|
||||||
|
} else {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\""
|
||||||
|
)
|
||||||
|
addPart(
|
||||||
|
partHeaders,
|
||||||
|
parameterToString(value).toRequestBody(null)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
mediaType == FormUrlEncMediaType -> {
|
||||||
FormBody.Builder().apply {
|
FormBody.Builder().apply {
|
||||||
// content's type *must* be Map<String, Any>
|
// content's type *must* be Map<String, Any?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
(content as Map<String,String>).forEach { (key, value) ->
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
add(key, value)
|
add(key, parameterToString(value))
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@ -172,6 +219,26 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun parameterToString(value: Any?): String {
|
||||||
|
when (value) {
|
||||||
|
null -> {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
is Array<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is Iterable<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime, is Date -> {
|
||||||
|
return parseDateToQueryString<Any>(value)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
||||||
/*
|
/*
|
||||||
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
||||||
|
@ -291,9 +291,9 @@ internal class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2")
|
|||||||
*/
|
*/
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("name" to "$name", "status" to "$status")
|
val localVariableBody: kotlin.Any? = mapOf("name" to name, "status" to status)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "application/x-www-form-urlencoded")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
||||||
@ -334,9 +334,9 @@ internal class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2")
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to "$additionalMetadata", "file" to "$file")
|
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to additionalMetadata, "file" to file)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "multipart/form-data")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
||||||
|
@ -10,7 +10,16 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|||||||
import okhttp3.ResponseBody
|
import okhttp3.ResponseBody
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.MultipartBody
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.URLConnection
|
||||||
|
import java.util.Date
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.LocalTime
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.OffsetTime
|
||||||
|
|
||||||
internal open class ApiClient(val baseUrl: String) {
|
internal open class ApiClient(val baseUrl: String) {
|
||||||
internal companion object {
|
internal companion object {
|
||||||
@ -37,17 +46,55 @@ internal open class ApiClient(val baseUrl: String) {
|
|||||||
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess Content-Type header from the given file (defaults to "application/octet-stream").
|
||||||
|
*
|
||||||
|
* @param file The given file
|
||||||
|
* @return The guessed Content-Type
|
||||||
|
*/
|
||||||
|
protected fun guessContentTypeFromFile(file: File): String {
|
||||||
|
val contentType = URLConnection.guessContentTypeFromName(file.name)
|
||||||
|
return contentType ?: "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
||||||
when {
|
when {
|
||||||
content is File -> content.asRequestBody(
|
content is File -> content.asRequestBody(
|
||||||
mediaType.toMediaTypeOrNull()
|
mediaType.toMediaTypeOrNull()
|
||||||
)
|
)
|
||||||
mediaType == FormDataMediaType || mediaType == FormUrlEncMediaType -> {
|
mediaType == FormDataMediaType -> {
|
||||||
|
MultipartBody.Builder()
|
||||||
|
.setType(MultipartBody.FORM)
|
||||||
|
.apply {
|
||||||
|
// content's type *must* be Map<String, Any?>
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
|
if (value is File) {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\"; filename=\"${value.name}\""
|
||||||
|
)
|
||||||
|
val fileMediaType = guessContentTypeFromFile(value).toMediaTypeOrNull()
|
||||||
|
addPart(partHeaders, value.asRequestBody(fileMediaType))
|
||||||
|
} else {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\""
|
||||||
|
)
|
||||||
|
addPart(
|
||||||
|
partHeaders,
|
||||||
|
parameterToString(value).toRequestBody(null)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
mediaType == FormUrlEncMediaType -> {
|
||||||
FormBody.Builder().apply {
|
FormBody.Builder().apply {
|
||||||
// content's type *must* be Map<String, Any>
|
// content's type *must* be Map<String, Any?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
(content as Map<String,String>).forEach { (key, value) ->
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
add(key, value)
|
add(key, parameterToString(value))
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@ -172,6 +219,26 @@ internal open class ApiClient(val baseUrl: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun parameterToString(value: Any?): String {
|
||||||
|
when (value) {
|
||||||
|
null -> {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
is Array<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is Iterable<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime, is Date -> {
|
||||||
|
return parseDateToQueryString<Any>(value)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
||||||
/*
|
/*
|
||||||
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
||||||
|
@ -291,9 +291,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
*/
|
*/
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("name" to "$name", "status" to "$status")
|
val localVariableBody: kotlin.Any? = mapOf("name" to name, "status" to status)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "application/x-www-form-urlencoded")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
||||||
@ -334,9 +334,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse? {
|
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse? {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to "$additionalMetadata", "file" to "$file")
|
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to additionalMetadata, "file" to file)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "multipart/form-data")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
||||||
|
@ -10,7 +10,16 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|||||||
import okhttp3.ResponseBody
|
import okhttp3.ResponseBody
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.MultipartBody
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.URLConnection
|
||||||
|
import java.util.Date
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.LocalTime
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.OffsetTime
|
||||||
|
|
||||||
open class ApiClient(val baseUrl: String) {
|
open class ApiClient(val baseUrl: String) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -37,17 +46,55 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess Content-Type header from the given file (defaults to "application/octet-stream").
|
||||||
|
*
|
||||||
|
* @param file The given file
|
||||||
|
* @return The guessed Content-Type
|
||||||
|
*/
|
||||||
|
protected fun guessContentTypeFromFile(file: File): String {
|
||||||
|
val contentType = URLConnection.guessContentTypeFromName(file.name)
|
||||||
|
return contentType ?: "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
||||||
when {
|
when {
|
||||||
content is File -> content.asRequestBody(
|
content is File -> content.asRequestBody(
|
||||||
mediaType.toMediaTypeOrNull()
|
mediaType.toMediaTypeOrNull()
|
||||||
)
|
)
|
||||||
mediaType == FormDataMediaType || mediaType == FormUrlEncMediaType -> {
|
mediaType == FormDataMediaType -> {
|
||||||
|
MultipartBody.Builder()
|
||||||
|
.setType(MultipartBody.FORM)
|
||||||
|
.apply {
|
||||||
|
// content's type *must* be Map<String, Any?>
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
|
if (value is File) {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\"; filename=\"${value.name}\""
|
||||||
|
)
|
||||||
|
val fileMediaType = guessContentTypeFromFile(value).toMediaTypeOrNull()
|
||||||
|
addPart(partHeaders, value.asRequestBody(fileMediaType))
|
||||||
|
} else {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\""
|
||||||
|
)
|
||||||
|
addPart(
|
||||||
|
partHeaders,
|
||||||
|
parameterToString(value).toRequestBody(null)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
mediaType == FormUrlEncMediaType -> {
|
||||||
FormBody.Builder().apply {
|
FormBody.Builder().apply {
|
||||||
// content's type *must* be Map<String, Any>
|
// content's type *must* be Map<String, Any?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
(content as Map<String,String>).forEach { (key, value) ->
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
add(key, value)
|
add(key, parameterToString(value))
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@ -172,6 +219,26 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun parameterToString(value: Any?): String {
|
||||||
|
when (value) {
|
||||||
|
null -> {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
is Array<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is Iterable<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime, is Date -> {
|
||||||
|
return parseDateToQueryString<Any>(value)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
||||||
/*
|
/*
|
||||||
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
||||||
|
@ -291,9 +291,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
*/
|
*/
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("name" to "$name", "status" to "$status")
|
val localVariableBody: kotlin.Any? = mapOf("name" to name, "status" to status)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "application/x-www-form-urlencoded")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
||||||
@ -334,9 +334,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to "$additionalMetadata", "file" to "$file")
|
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to additionalMetadata, "file" to file)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "multipart/form-data")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
||||||
|
@ -8,7 +8,16 @@ import okhttp3.FormBody
|
|||||||
import okhttp3.HttpUrl
|
import okhttp3.HttpUrl
|
||||||
import okhttp3.ResponseBody
|
import okhttp3.ResponseBody
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.MultipartBody
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.URLConnection
|
||||||
|
import java.util.Date
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.LocalTime
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.OffsetTime
|
||||||
|
|
||||||
open class ApiClient(val baseUrl: String) {
|
open class ApiClient(val baseUrl: String) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -35,17 +44,55 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess Content-Type header from the given file (defaults to "application/octet-stream").
|
||||||
|
*
|
||||||
|
* @param file The given file
|
||||||
|
* @return The guessed Content-Type
|
||||||
|
*/
|
||||||
|
protected fun guessContentTypeFromFile(file: File): String {
|
||||||
|
val contentType = URLConnection.guessContentTypeFromName(file.name)
|
||||||
|
return contentType ?: "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
||||||
when {
|
when {
|
||||||
content is File -> RequestBody.create(
|
content is File -> RequestBody.create(
|
||||||
MediaType.parse(mediaType), content
|
MediaType.parse(mediaType), content
|
||||||
)
|
)
|
||||||
mediaType == FormDataMediaType || mediaType == FormUrlEncMediaType -> {
|
mediaType == FormDataMediaType -> {
|
||||||
|
MultipartBody.Builder()
|
||||||
|
.setType(MultipartBody.FORM)
|
||||||
|
.apply {
|
||||||
|
// content's type *must* be Map<String, Any?>
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
|
if (value is File) {
|
||||||
|
val partHeaders = Headers.of(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\"; filename=\"${value.name}\""
|
||||||
|
)
|
||||||
|
val fileMediaType = MediaType.parse(guessContentTypeFromFile(value))
|
||||||
|
addPart(partHeaders, RequestBody.create(fileMediaType, value))
|
||||||
|
} else {
|
||||||
|
val partHeaders = Headers.of(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\""
|
||||||
|
)
|
||||||
|
addPart(
|
||||||
|
partHeaders,
|
||||||
|
RequestBody.create(null, parameterToString(value))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
mediaType == FormUrlEncMediaType -> {
|
||||||
FormBody.Builder().apply {
|
FormBody.Builder().apply {
|
||||||
// content's type *must* be Map<String, Any>
|
// content's type *must* be Map<String, Any?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
(content as Map<String,String>).forEach { (key, value) ->
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
add(key, value)
|
add(key, parameterToString(value))
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@ -170,6 +217,26 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun parameterToString(value: Any?): String {
|
||||||
|
when (value) {
|
||||||
|
null -> {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
is Array<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is Iterable<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime, is Date -> {
|
||||||
|
return parseDateToQueryString<Any>(value)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
||||||
/*
|
/*
|
||||||
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
||||||
|
@ -291,9 +291,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
*/
|
*/
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("name" to "$name", "status" to "$status")
|
val localVariableBody: kotlin.Any? = mapOf("name" to name, "status" to status)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "application/x-www-form-urlencoded")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
||||||
@ -334,9 +334,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to "$additionalMetadata", "file" to "$file")
|
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to additionalMetadata, "file" to file)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "multipart/form-data")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
||||||
|
@ -10,7 +10,16 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|||||||
import okhttp3.ResponseBody
|
import okhttp3.ResponseBody
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.MultipartBody
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.URLConnection
|
||||||
|
import java.util.Date
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.LocalTime
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.OffsetTime
|
||||||
|
|
||||||
open class ApiClient(val baseUrl: String) {
|
open class ApiClient(val baseUrl: String) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -37,17 +46,55 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess Content-Type header from the given file (defaults to "application/octet-stream").
|
||||||
|
*
|
||||||
|
* @param file The given file
|
||||||
|
* @return The guessed Content-Type
|
||||||
|
*/
|
||||||
|
protected fun guessContentTypeFromFile(file: File): String {
|
||||||
|
val contentType = URLConnection.guessContentTypeFromName(file.name)
|
||||||
|
return contentType ?: "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
||||||
when {
|
when {
|
||||||
content is File -> content.asRequestBody(
|
content is File -> content.asRequestBody(
|
||||||
mediaType.toMediaTypeOrNull()
|
mediaType.toMediaTypeOrNull()
|
||||||
)
|
)
|
||||||
mediaType == FormDataMediaType || mediaType == FormUrlEncMediaType -> {
|
mediaType == FormDataMediaType -> {
|
||||||
|
MultipartBody.Builder()
|
||||||
|
.setType(MultipartBody.FORM)
|
||||||
|
.apply {
|
||||||
|
// content's type *must* be Map<String, Any?>
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
|
if (value is File) {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\"; filename=\"${value.name}\""
|
||||||
|
)
|
||||||
|
val fileMediaType = guessContentTypeFromFile(value).toMediaTypeOrNull()
|
||||||
|
addPart(partHeaders, value.asRequestBody(fileMediaType))
|
||||||
|
} else {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\""
|
||||||
|
)
|
||||||
|
addPart(
|
||||||
|
partHeaders,
|
||||||
|
parameterToString(value).toRequestBody(null)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
mediaType == FormUrlEncMediaType -> {
|
||||||
FormBody.Builder().apply {
|
FormBody.Builder().apply {
|
||||||
// content's type *must* be Map<String, Any>
|
// content's type *must* be Map<String, Any?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
(content as Map<String,String>).forEach { (key, value) ->
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
add(key, value)
|
add(key, parameterToString(value))
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@ -172,6 +219,26 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun parameterToString(value: Any?): String {
|
||||||
|
when (value) {
|
||||||
|
null -> {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
is Array<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is Iterable<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime, is Date -> {
|
||||||
|
return parseDateToQueryString<Any>(value)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
||||||
/*
|
/*
|
||||||
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
||||||
|
@ -291,9 +291,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
*/
|
*/
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("name" to "$name", "status" to "$status")
|
val localVariableBody: kotlin.Any? = mapOf("name" to name, "status" to status)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "application/x-www-form-urlencoded")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
||||||
@ -334,9 +334,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to "$additionalMetadata", "file" to "$file")
|
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to additionalMetadata, "file" to file)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "multipart/form-data")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
||||||
|
@ -10,7 +10,16 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|||||||
import okhttp3.ResponseBody
|
import okhttp3.ResponseBody
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.MultipartBody
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.URLConnection
|
||||||
|
import java.util.Date
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
|
import org.threeten.bp.LocalDateTime
|
||||||
|
import org.threeten.bp.LocalTime
|
||||||
|
import org.threeten.bp.OffsetDateTime
|
||||||
|
import org.threeten.bp.OffsetTime
|
||||||
|
|
||||||
open class ApiClient(val baseUrl: String) {
|
open class ApiClient(val baseUrl: String) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -37,17 +46,55 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess Content-Type header from the given file (defaults to "application/octet-stream").
|
||||||
|
*
|
||||||
|
* @param file The given file
|
||||||
|
* @return The guessed Content-Type
|
||||||
|
*/
|
||||||
|
protected fun guessContentTypeFromFile(file: File): String {
|
||||||
|
val contentType = URLConnection.guessContentTypeFromName(file.name)
|
||||||
|
return contentType ?: "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
||||||
when {
|
when {
|
||||||
content is File -> content.asRequestBody(
|
content is File -> content.asRequestBody(
|
||||||
mediaType.toMediaTypeOrNull()
|
mediaType.toMediaTypeOrNull()
|
||||||
)
|
)
|
||||||
mediaType == FormDataMediaType || mediaType == FormUrlEncMediaType -> {
|
mediaType == FormDataMediaType -> {
|
||||||
|
MultipartBody.Builder()
|
||||||
|
.setType(MultipartBody.FORM)
|
||||||
|
.apply {
|
||||||
|
// content's type *must* be Map<String, Any?>
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
|
if (value is File) {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\"; filename=\"${value.name}\""
|
||||||
|
)
|
||||||
|
val fileMediaType = guessContentTypeFromFile(value).toMediaTypeOrNull()
|
||||||
|
addPart(partHeaders, value.asRequestBody(fileMediaType))
|
||||||
|
} else {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\""
|
||||||
|
)
|
||||||
|
addPart(
|
||||||
|
partHeaders,
|
||||||
|
parameterToString(value).toRequestBody(null)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
mediaType == FormUrlEncMediaType -> {
|
||||||
FormBody.Builder().apply {
|
FormBody.Builder().apply {
|
||||||
// content's type *must* be Map<String, Any>
|
// content's type *must* be Map<String, Any?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
(content as Map<String,String>).forEach { (key, value) ->
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
add(key, value)
|
add(key, parameterToString(value))
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@ -172,6 +219,26 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun parameterToString(value: Any?): String {
|
||||||
|
when (value) {
|
||||||
|
null -> {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
is Array<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is Iterable<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime, is Date -> {
|
||||||
|
return parseDateToQueryString<Any>(value)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
||||||
/*
|
/*
|
||||||
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
||||||
|
@ -291,9 +291,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
*/
|
*/
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?) : Unit {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("name" to "$name", "status" to "$status")
|
val localVariableBody: kotlin.Any? = mapOf("name" to name, "status" to status)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "application/x-www-form-urlencoded")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}".replace("{"+"petId"+"}", "$petId"),
|
||||||
@ -334,9 +334,9 @@ class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiCli
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
@Throws(UnsupportedOperationException::class, ClientException::class, ServerException::class)
|
||||||
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: java.io.File?) : ApiResponse {
|
||||||
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to "$additionalMetadata", "file" to "$file")
|
val localVariableBody: kotlin.Any? = mapOf("additionalMetadata" to additionalMetadata, "file" to file)
|
||||||
val localVariableQuery: MultiValueMap = mutableMapOf()
|
val localVariableQuery: MultiValueMap = mutableMapOf()
|
||||||
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "")
|
val localVariableHeaders: MutableMap<String, String> = mutableMapOf("Content-Type" to "multipart/form-data")
|
||||||
val localVariableConfig = RequestConfig(
|
val localVariableConfig = RequestConfig(
|
||||||
RequestMethod.POST,
|
RequestMethod.POST,
|
||||||
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
"/pet/{petId}/uploadImage".replace("{"+"petId"+"}", "$petId"),
|
||||||
|
@ -10,7 +10,16 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|||||||
import okhttp3.ResponseBody
|
import okhttp3.ResponseBody
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.MultipartBody
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.net.URLConnection
|
||||||
|
import java.util.Date
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.LocalTime
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.OffsetTime
|
||||||
|
|
||||||
open class ApiClient(val baseUrl: String) {
|
open class ApiClient(val baseUrl: String) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -37,17 +46,55 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
val builder: OkHttpClient.Builder = OkHttpClient.Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess Content-Type header from the given file (defaults to "application/octet-stream").
|
||||||
|
*
|
||||||
|
* @param file The given file
|
||||||
|
* @return The guessed Content-Type
|
||||||
|
*/
|
||||||
|
protected fun guessContentTypeFromFile(file: File): String {
|
||||||
|
val contentType = URLConnection.guessContentTypeFromName(file.name)
|
||||||
|
return contentType ?: "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
protected inline fun <reified T> requestBody(content: T, mediaType: String = JsonMediaType): RequestBody =
|
||||||
when {
|
when {
|
||||||
content is File -> content.asRequestBody(
|
content is File -> content.asRequestBody(
|
||||||
mediaType.toMediaTypeOrNull()
|
mediaType.toMediaTypeOrNull()
|
||||||
)
|
)
|
||||||
mediaType == FormDataMediaType || mediaType == FormUrlEncMediaType -> {
|
mediaType == FormDataMediaType -> {
|
||||||
|
MultipartBody.Builder()
|
||||||
|
.setType(MultipartBody.FORM)
|
||||||
|
.apply {
|
||||||
|
// content's type *must* be Map<String, Any?>
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
|
if (value is File) {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\"; filename=\"${value.name}\""
|
||||||
|
)
|
||||||
|
val fileMediaType = guessContentTypeFromFile(value).toMediaTypeOrNull()
|
||||||
|
addPart(partHeaders, value.asRequestBody(fileMediaType))
|
||||||
|
} else {
|
||||||
|
val partHeaders = Headers.headersOf(
|
||||||
|
"Content-Disposition",
|
||||||
|
"form-data; name=\"$key\""
|
||||||
|
)
|
||||||
|
addPart(
|
||||||
|
partHeaders,
|
||||||
|
parameterToString(value).toRequestBody(null)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
mediaType == FormUrlEncMediaType -> {
|
||||||
FormBody.Builder().apply {
|
FormBody.Builder().apply {
|
||||||
// content's type *must* be Map<String, Any>
|
// content's type *must* be Map<String, Any?>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
(content as Map<String,String>).forEach { (key, value) ->
|
(content as Map<String, Any?>).forEach { (key, value) ->
|
||||||
add(key, value)
|
add(key, parameterToString(value))
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@ -172,6 +219,26 @@ open class ApiClient(val baseUrl: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun parameterToString(value: Any?): String {
|
||||||
|
when (value) {
|
||||||
|
null -> {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
is Array<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is Iterable<*> -> {
|
||||||
|
return toMultiValue(value, "csv").toString()
|
||||||
|
}
|
||||||
|
is OffsetDateTime, is OffsetTime, is LocalDateTime, is LocalDate, is LocalTime, is Date -> {
|
||||||
|
return parseDateToQueryString<Any>(value)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
protected inline fun <reified T: Any> parseDateToQueryString(value : T): String {
|
||||||
/*
|
/*
|
||||||
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
.replace("\"", "") converts the json object string to an actual string for the query parameter.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user