3131import static com .openblocks .sdk .exception .PluginCommonError .QUERY_ARGUMENT_ERROR ;
3232import static com .openblocks .sdk .exception .PluginCommonError .QUERY_EXECUTION_ERROR ;
3333import static com .openblocks .sdk .plugin .restapi .DataUtils .convertToMultiformFileValue ;
34- import static com .openblocks .sdk .plugin .restapi .DataUtils .parseJsonBody ;
3534import static com .openblocks .sdk .plugin .restapi .auth .RestApiAuthType .DIGEST_AUTH ;
3635import static com .openblocks .sdk .plugin .restapi .auth .RestApiAuthType .OAUTH2_INHERIT_FROM_LOGIN ;
3736import static com .openblocks .sdk .util .ExceptionUtils .propagateError ;
3837import static com .openblocks .sdk .util .JsonUtils .readTree ;
3938import static com .openblocks .sdk .util .JsonUtils .toJsonThrows ;
40- import static com .openblocks .sdk .util .MustacheHelper .renderMustacheJsonString ;
39+ import static com .openblocks .sdk .util .MustacheHelper .renderMustacheJson ;
4140import static com .openblocks .sdk .util .MustacheHelper .renderMustacheString ;
4241import static com .openblocks .sdk .util .StreamUtils .collectList ;
4342import static org .apache .commons .collections4 .MapUtils .emptyIfNull ;
6362
6463import org .apache .commons .collections4 .CollectionUtils ;
6564import org .apache .commons .lang3 .StringUtils ;
65+ import org .apache .commons .lang3 .tuple .Pair ;
6666import org .bson .internal .Base64 ;
6767import org .pf4j .Extension ;
6868import org .springframework .http .HttpCookie ;
8585import com .openblocks .plugin .restapi .constants .ResponseDataType ;
8686import com .openblocks .plugin .restapi .helpers .AuthHelper ;
8787import com .openblocks .plugin .restapi .helpers .BufferingFilter ;
88+ import com .openblocks .plugin .restapi .model .QueryBody ;
8889import com .openblocks .plugin .restapi .model .RestApiQueryConfig ;
8990import com .openblocks .plugin .restapi .model .RestApiQueryExecutionContext ;
9091import com .openblocks .sdk .exception .PluginException ;
100101import com .openblocks .sdk .plugin .restapi .auth .BasicAuthConfig ;
101102import com .openblocks .sdk .plugin .restapi .auth .RestApiAuthType ;
102103import com .openblocks .sdk .query .QueryVisitorContext ;
103- import com .openblocks .sdk .util .JsonUtils ;
104104import com .openblocks .sdk .webclient .WebClients ;
105105
106106import lombok .Builder ;
@@ -159,18 +159,23 @@ public RestApiQueryExecutionContext buildQueryExecutionContext(RestApiDatasource
159159
160160 List <Property > updatedQueryBodyParams = renderMustacheValueForQueryBody (queryBodyParams , requestParams , contentType );
161161
162- String updatedQueryBody ;
163- if (isJsonContentType (contentType )) {
164- updatedQueryBody = renderMustacheJsonString (queryBody , requestParams );
162+ // string | jsonNode
163+ QueryBody updatedQueryBody ;
164+ Pair <Boolean , Boolean > jsonContentType = isJsonContentType (contentType );
165+ boolean isJsonContent = jsonContentType .getLeft ();
166+ Boolean isSpecialJsonContent = jsonContentType .getRight ();
167+ if (isJsonContent ) {
168+ updatedQueryBody = new QueryBody (renderMustacheJson (queryBody , requestParams ), true , isSpecialJsonContent );
165169 } else {
166- updatedQueryBody = renderMustacheString (queryBody , requestParams );
170+ updatedQueryBody = new QueryBody ( renderMustacheString (queryBody , requestParams ), false , false );
167171 }
168172
169173 Map <String , String > urlParams = buildUrlParams (datasourceUrlParams , updatedQueryParams );
170174 List <Property > bodyParams = mergeBody (datasourceBodyFormData , updatedQueryBodyParams );
171175
172176 URI uri = RestApiUriBuilder .buildUri (urlDomain , updatedQueryPath , requestParams , urlParams );
173177
178+ QueryBody mergedQueryBody = mergeBody (updatedQueryBody , datasourceBodyFormData );
174179 return RestApiQueryExecutionContext .builder ()
175180 .httpMethod (httpMethod )
176181 .uri (uri )
@@ -179,7 +184,7 @@ public RestApiQueryExecutionContext buildQueryExecutionContext(RestApiDatasource
179184 .urlParams (urlParams )
180185 .bodyParams (bodyParams )
181186 .encodeParams (encodeParams )
182- .queryBody (mergeBody ( updatedQueryBody , datasourceBodyFormData , contentType ) )
187+ .queryBody (mergedQueryBody )
183188 .forwardCookies (forwardCookies )
184189 .forwardAllCookies (forwardAllCookies )
185190 .requestCookies (queryVisitorContext .getCookies ())
@@ -206,21 +211,19 @@ private List<Property> renderMustacheValueForQueryBody(List<Property> queryBodyP
206211 }
207212
208213
209- private String mergeBody (String queryBody , List <Property > datasourceBody , String contentType ) {
210- if (CollectionUtils .isEmpty (datasourceBody )) {
214+ private QueryBody mergeBody (QueryBody queryBody , List <Property > datasourceBody ) {
215+ if (! queryBody . isJsonContent () || CollectionUtils .isEmpty (datasourceBody )) {
211216 return queryBody ;
212217 }
213- if (! isJsonContentType ( contentType )) {
214- return queryBody ;
215- }
216- Map < String , Object > map = JsonUtils . fromJsonMap ( queryBody );
217- if ( map == null ) {
218+ JsonNode jsonNode = queryBody . getJsonValue ();
219+ if ( jsonNode instanceof ObjectNode objectNode ) {
220+ for ( Property property : datasourceBody ) {
221+ objectNode . put ( property . getKey (), property . getValue () );
222+ }
218223 return queryBody ;
219224 }
220- for (Property property : datasourceBody ) {
221- map .putIfAbsent (property .getKey (), property .getValue ());
222- }
223- return JsonUtils .toJson (map );
225+
226+ return queryBody ;
224227 }
225228
226229 @ Override
@@ -469,7 +472,7 @@ private Map<String, String> buildHeaders(List<Property> datasourceHeaders, List<
469472 private BodyInserter <?, ? super ClientHttpRequest > buildBodyInserter (HttpMethod httpMethod ,
470473 boolean isEncodeParams ,
471474 String requestContentType ,
472- String queryBody ,
475+ QueryBody queryBody ,
473476 List <Property > bodyFormData ) {
474477
475478 if (HttpMethod .GET .equals (httpMethod )) {
@@ -480,15 +483,19 @@ private Map<String, String> buildHeaders(List<Property> datasourceHeaders, List<
480483 return BodyInserters .fromValue (new byte [0 ]);
481484 }
482485
483- if (isJsonContentType (requestContentType )) {
484- return BodyInserters .fromValue (parseJsonBody (queryBody ));
486+ if (queryBody .isSpecialJson ()) {
487+ return BodyInserters .fromValue (queryBody .getJsonValue ().toString ());
488+ }
489+
490+ if (queryBody .isJsonContent ()) {
491+ return BodyInserters .fromValue (queryBody .getJsonValue ());
485492 }
486493
487494 if (MediaType .APPLICATION_FORM_URLENCODED_VALUE .equals (requestContentType )
488495 || MediaType .MULTIPART_FORM_DATA_VALUE .equals (requestContentType )) {
489496 return dataUtils .buildBodyInserter (bodyFormData , requestContentType , isEncodeParams );
490497 }
491- return BodyInserters .fromValue (queryBody );
498+ return BodyInserters .fromValue (queryBody . value () );
492499 }
493500
494501 private boolean isNoneContentType (String requestContentType ) {
0 commit comments