18
18
19
19
20
20
import java .net .URI ;
21
- import java .net .URISyntaxException ;
22
21
import java .util .ArrayList ;
23
22
import java .util .Arrays ;
24
23
import java .util .List ;
40
39
import org .springframework .http .client .reactive .ClientHttpRequestFactory ;
41
40
import org .springframework .util .Assert ;
42
41
import org .springframework .web .client .RestClientException ;
42
+ import org .springframework .web .util .DefaultUriTemplateHandler ;
43
+ import org .springframework .web .util .UriTemplateHandler ;
43
44
44
45
/**
45
46
* Builds a {@link ClientHttpRequest}
51
52
*/
52
53
public class DefaultHttpRequestBuilder implements HttpRequestBuilder {
53
54
55
+ private final UriTemplateHandler uriTemplateHandler = new DefaultUriTemplateHandler ();
56
+
54
57
protected HttpMethod httpMethod ;
55
58
56
59
protected HttpHeaders httpHeaders ;
@@ -59,8 +62,6 @@ public class DefaultHttpRequestBuilder implements HttpRequestBuilder {
59
62
60
63
protected Publisher contentPublisher ;
61
64
62
- protected List <Encoder <?>> messageEncoders ;
63
-
64
65
protected final List <HttpCookie > cookies = new ArrayList <HttpCookie >();
65
66
66
67
protected DefaultHttpRequestBuilder () {
@@ -69,7 +70,7 @@ protected DefaultHttpRequestBuilder() {
69
70
public DefaultHttpRequestBuilder (HttpMethod httpMethod , String urlTemplate , Object ... urlVariables ) throws RestClientException {
70
71
this .httpMethod = httpMethod ;
71
72
this .httpHeaders = new HttpHeaders ();
72
- this .url = parseURI (urlTemplate );
73
+ this .url = this . uriTemplateHandler . expand (urlTemplate , urlVariables );
73
74
}
74
75
75
76
public DefaultHttpRequestBuilder (HttpMethod httpMethod , URI url ) {
@@ -78,24 +79,6 @@ public DefaultHttpRequestBuilder(HttpMethod httpMethod, URI url) {
78
79
this .url = url ;
79
80
}
80
81
81
- protected DefaultHttpRequestBuilder setMessageEncoders (List <Encoder <?>> messageEncoders ) {
82
- this .messageEncoders = messageEncoders ;
83
- return this ;
84
- }
85
-
86
- private URI parseURI (String uri ) throws RestClientException {
87
- try {
88
- return new URI (uri );
89
- }
90
- catch (URISyntaxException e ) {
91
- throw new RestClientException ("could not parse URL template" , e );
92
- }
93
- }
94
-
95
- public DefaultHttpRequestBuilder param (String name , String ... values ) {
96
- return this ;
97
- }
98
-
99
82
public DefaultHttpRequestBuilder header (String name , String ... values ) {
100
83
Arrays .stream (values ).forEach (value -> this .httpHeaders .add (name , value ));
101
84
return this ;
@@ -133,7 +116,7 @@ public DefaultHttpRequestBuilder content(Object content) {
133
116
return this ;
134
117
}
135
118
136
- public DefaultHttpRequestBuilder contentStream (Publisher content ) {
119
+ public DefaultHttpRequestBuilder contentStream (Publisher <?> content ) {
137
120
this .contentPublisher = Flux .from (content );
138
121
return this ;
139
122
}
@@ -153,15 +136,18 @@ public DefaultHttpRequestBuilder apply(RequestPostProcessor postProcessor) {
153
136
return this ;
154
137
}
155
138
156
- public ClientHttpRequest build (ClientHttpRequestFactory factory ) {
139
+ public ClientHttpRequest build (ClientHttpRequestFactory factory , List < Encoder <?>> messageEncoders ) {
157
140
ClientHttpRequest request = factory .createRequest (this .httpMethod , this .url , this .httpHeaders );
158
141
request .getHeaders ().putAll (this .httpHeaders );
159
142
160
143
if (this .contentPublisher != null ) {
161
144
ResolvableType requestBodyType = ResolvableType .forInstance (this .contentPublisher );
162
145
MediaType mediaType = request .getHeaders ().getContentType ();
163
146
164
- Optional <Encoder <?>> messageEncoder = resolveEncoder (requestBodyType , mediaType );
147
+ Optional <Encoder <?>> messageEncoder = messageEncoders
148
+ .stream ()
149
+ .filter (e -> e .canEncode (requestBodyType , mediaType ))
150
+ .findFirst ();
165
151
166
152
if (messageEncoder .isPresent ()) {
167
153
DataBufferAllocator allocator = request .allocator ();
@@ -175,13 +161,7 @@ public ClientHttpRequest build(ClientHttpRequestFactory factory) {
175
161
"' for content-type '" + mediaType .toString () + "'" );
176
162
}
177
163
}
178
-
179
164
return request ;
180
165
}
181
166
182
- protected Optional <Encoder <?>> resolveEncoder (ResolvableType type , MediaType mediaType ) {
183
- return this .messageEncoders .stream ()
184
- .filter (e -> e .canEncode (type , mediaType )).findFirst ();
185
- }
186
-
187
167
}
0 commit comments