|
|
@@ -6,9 +6,11 @@ import org.springframework.http.HttpHeaders |
|
|
|
import org.springframework.http.MediaType |
|
|
|
import org.springframework.stereotype.Service |
|
|
|
import org.springframework.util.LinkedMultiValueMap |
|
|
|
import org.springframework.util.MultiValueMap |
|
|
|
import org.springframework.web.reactive.function.client.WebClient |
|
|
|
import org.springframework.web.reactive.function.client.bodyToMono |
|
|
|
import reactor.core.publisher.Mono |
|
|
|
import kotlin.reflect.full.memberProperties |
|
|
|
|
|
|
|
@Service |
|
|
|
open class ApiCallerService( |
|
|
@@ -16,15 +18,20 @@ open class ApiCallerService( |
|
|
|
private val m18Config: M18Config |
|
|
|
) { |
|
|
|
|
|
|
|
private val webClient: WebClient = WebClient.builder() |
|
|
|
val webClient: WebClient = WebClient.builder() |
|
|
|
.baseUrl(baseUrl) |
|
|
|
.defaultHeaders { headers -> |
|
|
|
headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) |
|
|
|
headers.set(HttpHeaders.AUTHORIZATION, "Bearer ${m18Config.ACCESS_TOKEN}") |
|
|
|
headers.set("client_id", m18Config.CLIENT_ID) |
|
|
|
} |
|
|
|
.build() |
|
|
|
|
|
|
|
fun get(urlPath: String, params: Map<String, String>?, customHeaders: Map<String, String>?): Mono<String> { |
|
|
|
inline fun <reified T : Any> get( |
|
|
|
urlPath: String, |
|
|
|
params: MultiValueMap<String, String>, |
|
|
|
customHeaders: Map<String, String>? |
|
|
|
): Mono<T> { |
|
|
|
|
|
|
|
return webClient.get() |
|
|
|
.uri { uriBuilder -> |
|
|
@@ -33,15 +40,7 @@ open class ApiCallerService( |
|
|
|
path(urlPath) |
|
|
|
|
|
|
|
// convert to multiValueMap |
|
|
|
params?.let { params -> |
|
|
|
queryParams( |
|
|
|
LinkedMultiValueMap<String, String>().apply { |
|
|
|
params.forEach { (key, values) -> |
|
|
|
add(key, values) |
|
|
|
} |
|
|
|
} |
|
|
|
) |
|
|
|
} |
|
|
|
queryParams(params) |
|
|
|
} |
|
|
|
.build() |
|
|
|
} |
|
|
@@ -49,6 +48,51 @@ open class ApiCallerService( |
|
|
|
customHeaders?.forEach { (k, v) -> headers.set(k, v) } |
|
|
|
} |
|
|
|
.retrieve() |
|
|
|
.bodyToMono(String::class.java) |
|
|
|
.bodyToMono(T::class.java) |
|
|
|
} |
|
|
|
|
|
|
|
inline fun <reified T : Any> get( |
|
|
|
urlPath: String, |
|
|
|
params: Map<String, Any>?, |
|
|
|
customHeaders: Map<String, String>? |
|
|
|
): Mono<T> { |
|
|
|
|
|
|
|
// convert to multiValueMap<String, String> |
|
|
|
val queryParams = params?.let { paramMap -> |
|
|
|
LinkedMultiValueMap<String, String>().apply { |
|
|
|
paramMap.forEach { (key, value) -> |
|
|
|
when (value) { |
|
|
|
is Collection<*> -> addAll(key, value.map { it.toString() }) |
|
|
|
else -> add(key, value.toString()) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} ?: LinkedMultiValueMap<String, String>() |
|
|
|
|
|
|
|
return get<T>(urlPath, queryParams, customHeaders) |
|
|
|
} |
|
|
|
|
|
|
|
// T: Response, U: Request |
|
|
|
inline fun <reified T : Any, reified U : Any> get( |
|
|
|
urlPath: String, |
|
|
|
params: U?, |
|
|
|
customHeaders: Map<String, String>? |
|
|
|
): Mono<T> { |
|
|
|
|
|
|
|
// convert to multiValueMap<String, String> |
|
|
|
val queryParams = params?.let { |
|
|
|
LinkedMultiValueMap<String, String>().apply { |
|
|
|
U::class.memberProperties.forEach { property -> |
|
|
|
val key = property.name |
|
|
|
val value = property.get(params) |
|
|
|
when (value) { |
|
|
|
is Collection<*> -> value.forEach { item -> add(key, item.toString()) } |
|
|
|
else -> add(key, value.toString()) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} ?: LinkedMultiValueMap<String, String>() |
|
|
|
|
|
|
|
return get<T>(urlPath, queryParams, customHeaders) |
|
|
|
} |
|
|
|
} |