Skip to content

Commit aba5ca8

Browse files
author
e507804
committed
URL parameters in GET request would not ge properly url-encoded. The + sign would not get encoded, but decoded, resulting in a space, which in turn resulted in invalid parameters on the server side
1 parent 91d2852 commit aba5ca8

File tree

3 files changed

+35
-7
lines changed
  • modules/swagger-codegen/src/main/resources/Java/libraries/resttemplate
  • samples/client/petstore/java/resttemplate

3 files changed

+35
-7
lines changed

modules/swagger-codegen/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache

+17-3
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import java.util.List;
6060
import java.util.Map;
6161
import java.util.Map.Entry;
6262
import java.util.TimeZone;
63+
import java.util.stream.IntStream;
6364

6465
import {{invokerPackage}}.auth.Authentication;
6566
import {{invokerPackage}}.auth.HttpBasicAuth;
@@ -524,13 +525,26 @@ public class ApiClient {
524525
*/
525526
public <T> T invokeAPI(String path, HttpMethod method, MultiValueMap<String, String> queryParams, Object body, HttpHeaders headerParams, MultiValueMap<String, Object> formParams, List<MediaType> accept, MediaType contentType, String[] authNames, ParameterizedTypeReference<T> returnType) throws RestClientException {
526527
updateParamsForAuth(authNames, queryParams, headerParams);
527-
528-
final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(basePath).path(path);
528+
529+
Map<String, String> params = new HashMap<>();
530+
final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(basePath).path(path).encode();
531+
529532
if (queryParams != null) {
530533
builder.queryParams(queryParams);
534+
LinkedMultiValueMap<String, String> keys = new LinkedMultiValueMap<>();
535+
536+
for (Map.Entry<String, List<String>> e : queryParams.entrySet()) {
537+
IntStream.range(0, e.getValue().size())
538+
.forEach(i -> {
539+
keys.add(e.getKey(), "{" + e.getKey() + i + "}");
540+
params.put(e.getKey() + i, e.getValue().get(i));
541+
});
542+
}
543+
544+
builder.queryParams(keys);
531545
}
532546

533-
final BodyBuilder requestBuilder = RequestEntity.method(method, builder.build().toUri());
547+
final BodyBuilder requestBuilder = RequestEntity.method(method, builder.buildAndExpand(params).toUri());
534548
if(accept != null) {
535549
requestBuilder.accept(accept.toArray(new MediaType[accept.size()]));
536550
}
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.4.3-SNAPSHOT
1+
2.4.5-SNAPSHOT

samples/client/petstore/java/resttemplate/src/main/java/io/swagger/client/ApiClient.java

+17-3
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import java.util.Map;
5050
import java.util.Map.Entry;
5151
import java.util.TimeZone;
52+
import java.util.stream.IntStream;
5253

5354
import io.swagger.client.auth.Authentication;
5455
import io.swagger.client.auth.HttpBasicAuth;
@@ -512,13 +513,26 @@ protected Object selectBody(Object obj, MultiValueMap<String, Object> formParams
512513
*/
513514
public <T> T invokeAPI(String path, HttpMethod method, MultiValueMap<String, String> queryParams, Object body, HttpHeaders headerParams, MultiValueMap<String, Object> formParams, List<MediaType> accept, MediaType contentType, String[] authNames, ParameterizedTypeReference<T> returnType) throws RestClientException {
514515
updateParamsForAuth(authNames, queryParams, headerParams);
515-
516-
final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(basePath).path(path);
516+
517+
Map<String, String> params = new HashMap<>();
518+
final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(basePath).path(path).encode();
519+
517520
if (queryParams != null) {
518521
builder.queryParams(queryParams);
522+
LinkedMultiValueMap<String, String> keys = new LinkedMultiValueMap<>();
523+
524+
for (Map.Entry<String, List<String>> e : queryParams.entrySet()) {
525+
IntStream.range(0, e.getValue().size())
526+
.forEach(i -> {
527+
keys.add(e.getKey(), "{" + e.getKey() + i + "}");
528+
params.put(e.getKey() + i, e.getValue().get(i));
529+
});
530+
}
531+
532+
builder.queryParams(keys);
519533
}
520534

521-
final BodyBuilder requestBuilder = RequestEntity.method(method, builder.build().toUri());
535+
final BodyBuilder requestBuilder = RequestEntity.method(method, builder.buildAndExpand(params).toUri());
522536
if(accept != null) {
523537
requestBuilder.accept(accept.toArray(new MediaType[accept.size()]));
524538
}

0 commit comments

Comments
 (0)