Skip to content

Commit a3d03ba

Browse files
[kotlin] fix query parameter encoding (#22512)
* #22339 fix query parameter encoding * #22339 fix query parameter encoding * #22339 ran generate-samples with some local adaptations --------- Co-authored-by: AlbertWaninge <albert.waninge@edsn.nl>
1 parent 6abe6ff commit a3d03ba

File tree

3 files changed

+24
-18
lines changed
  • modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-spring-restclient/infrastructure
  • samples/client
    • echo_api/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/infrastructure
    • petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/infrastructure

3 files changed

+24
-18
lines changed

modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-spring-restclient/infrastructure/ApiClient.kt.mustache

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import org.springframework.core.ParameterizedTypeReference
44
import org.springframework.http.HttpHeaders
55
import org.springframework.http.HttpMethod
66
import org.springframework.http.MediaType
7-
import org.springframework.web.client.RestClient
87
import org.springframework.http.ResponseEntity
8+
import org.springframework.web.client.RestClient
9+
import org.springframework.web.util.UriComponentsBuilder
910
import org.springframework.util.LinkedMultiValueMap
1011

1112
{{^nonPublicApi}}{{#explicitApi}}public {{/explicitApi}}{{/nonPublicApi}}open class ApiClient(protected val client: RestClient) {
@@ -35,12 +36,13 @@ import org.springframework.util.LinkedMultiValueMap
3536
private fun <I> RestClient.method(requestConfig: RequestConfig<I>)=
3637
method(HttpMethod.valueOf(requestConfig.method.name))
3738

38-
private fun <I> RestClient.RequestBodyUriSpec.uri(requestConfig: RequestConfig<I>) =
39-
uri(requestConfig.path) { builder ->
40-
builder
41-
.queryParams(LinkedMultiValueMap(requestConfig.query))
42-
.build(requestConfig.params)
39+
private fun <I> RestClient.RequestBodyUriSpec.uri(requestConfig: RequestConfig<I>): RestClient.RequestBodySpec {
40+
val uriComponentsBuilder = UriComponentsBuilder.fromPath(requestConfig.path)
41+
requestConfig.query.forEach { key, values ->
42+
uriComponentsBuilder.queryParam(key, "{$key}")
4343
}
44+
return uri(uriComponentsBuilder.encode().buildAndExpand(requestConfig.query + requestConfig.params).toUri())
45+
}
4446

4547
private fun <I> RestClient.RequestBodySpec.headers(requestConfig: RequestConfig<I>) =
4648
apply { requestConfig.headers.forEach { (name, value) -> header(name, value) } }

samples/client/echo_api/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/infrastructure/ApiClient.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import org.springframework.core.ParameterizedTypeReference
44
import org.springframework.http.HttpHeaders
55
import org.springframework.http.HttpMethod
66
import org.springframework.http.MediaType
7-
import org.springframework.web.client.RestClient
87
import org.springframework.http.ResponseEntity
8+
import org.springframework.web.client.RestClient
9+
import org.springframework.web.util.UriComponentsBuilder
910
import org.springframework.util.LinkedMultiValueMap
1011

1112
open class ApiClient(protected val client: RestClient) {
@@ -35,12 +36,13 @@ open class ApiClient(protected val client: RestClient) {
3536
private fun <I> RestClient.method(requestConfig: RequestConfig<I>)=
3637
method(HttpMethod.valueOf(requestConfig.method.name))
3738

38-
private fun <I> RestClient.RequestBodyUriSpec.uri(requestConfig: RequestConfig<I>) =
39-
uri(requestConfig.path) { builder ->
40-
builder
41-
.queryParams(LinkedMultiValueMap(requestConfig.query))
42-
.build(requestConfig.params)
39+
private fun <I> RestClient.RequestBodyUriSpec.uri(requestConfig: RequestConfig<I>): RestClient.RequestBodySpec {
40+
val uriComponentsBuilder = UriComponentsBuilder.fromPath(requestConfig.path)
41+
requestConfig.query.forEach { key, values ->
42+
uriComponentsBuilder.queryParam(key, "{$key}")
4343
}
44+
return uri(uriComponentsBuilder.encode().buildAndExpand(requestConfig.query + requestConfig.params).toUri())
45+
}
4446

4547
private fun <I> RestClient.RequestBodySpec.headers(requestConfig: RequestConfig<I>) =
4648
apply { requestConfig.headers.forEach { (name, value) -> header(name, value) } }

samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/infrastructure/ApiClient.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import org.springframework.core.ParameterizedTypeReference
44
import org.springframework.http.HttpHeaders
55
import org.springframework.http.HttpMethod
66
import org.springframework.http.MediaType
7-
import org.springframework.web.client.RestClient
87
import org.springframework.http.ResponseEntity
8+
import org.springframework.web.client.RestClient
9+
import org.springframework.web.util.UriComponentsBuilder
910
import org.springframework.util.LinkedMultiValueMap
1011

1112
open class ApiClient(protected val client: RestClient) {
@@ -35,12 +36,13 @@ open class ApiClient(protected val client: RestClient) {
3536
private fun <I> RestClient.method(requestConfig: RequestConfig<I>)=
3637
method(HttpMethod.valueOf(requestConfig.method.name))
3738

38-
private fun <I> RestClient.RequestBodyUriSpec.uri(requestConfig: RequestConfig<I>) =
39-
uri(requestConfig.path) { builder ->
40-
builder
41-
.queryParams(LinkedMultiValueMap(requestConfig.query))
42-
.build(requestConfig.params)
39+
private fun <I> RestClient.RequestBodyUriSpec.uri(requestConfig: RequestConfig<I>): RestClient.RequestBodySpec {
40+
val uriComponentsBuilder = UriComponentsBuilder.fromPath(requestConfig.path)
41+
requestConfig.query.forEach { key, values ->
42+
uriComponentsBuilder.queryParam(key, "{$key}")
4343
}
44+
return uri(uriComponentsBuilder.encode().buildAndExpand(requestConfig.query + requestConfig.params).toUri())
45+
}
4446

4547
private fun <I> RestClient.RequestBodySpec.headers(requestConfig: RequestConfig<I>) =
4648
apply { requestConfig.headers.forEach { (name, value) -> header(name, value) } }

0 commit comments

Comments
 (0)