Skip to content

Commit b17ede3

Browse files
HTTP-78 Support for optional query parameters for body-based requests (#79)
Support for optional query parameters for body-based requests Signed-off-by: Olivier Zembri <<ozembri@fr.ibm.com>>
1 parent 6926370 commit b17ede3

16 files changed

+311
-49
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
transformation for Basic Authentication (base64, addition of "Basic " prefix).
1111
If not specified, defaults to `'false'`.
1212

13+
### Changed
14+
15+
- Changed API for `LookupQueryCreator`. The method `createLookupQuery` no longer returns a String but a
16+
[LookupQueryInfo](src/main/java/com/getindata/connectors/http/internal/table/lookup/LookupQueryInfo.java)
17+
Any custom implementation of this interface that aims to provide body-based request is able to provide
18+
the lookup query as the payload and an optional formatted string representing the query parameters.
19+
1320
## [0.11.0] - 2023-11-20
1421

1522
## [0.10.0] - 2023-07-05

src/main/java/com/getindata/connectors/http/LookupQueryCreator.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44

55
import org.apache.flink.table.data.RowData;
66

7+
import com.getindata.connectors.http.internal.table.lookup.LookupQueryInfo;
8+
79
/**
810
* An interface for a creator of a lookup query in the Http Lookup Source (e.g., the query that
9-
* gets appended to the URI in GET request).
11+
* gets appended as query parameters to the URI in GET request or supplied as the payload of a
12+
* body-based request along with optional query parameters).
1013
*
1114
* <p>One can customize how those queries are built by implementing {@link LookupQueryCreator} and
1215
* {@link LookupQueryCreatorFactory}.
@@ -20,5 +23,5 @@ public interface LookupQueryCreator extends Serializable {
2023
* @param lookupDataRow a {@link RowData} containing request parameters.
2124
* @return a lookup query.
2225
*/
23-
String createLookupQuery(RowData lookupDataRow);
26+
LookupQueryInfo createLookupQuery(RowData lookupDataRow);
2427
}

src/main/java/com/getindata/connectors/http/internal/table/lookup/BodyBasedRequestFactory.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ public BodyBasedRequestFactory(
3737
* Method for preparing {@link HttpRequest.Builder} for REST request that sends their parameters
3838
* in request body, for example PUT or POST methods
3939
*
40-
* @param lookupQuery lookup query used for request body.
40+
* @param lookupQueryInfo lookup query info used for request body.
4141
* @return {@link HttpRequest.Builder} for given lookupQuery.
4242
*/
4343
@Override
44-
protected Builder setUpRequestMethod(String lookupQuery) {
44+
protected Builder setUpRequestMethod(LookupQueryInfo lookupQueryInfo) {
4545
return HttpRequest.newBuilder()
46-
.uri(constructGetUri())
47-
.method(methodName, BodyPublishers.ofString(lookupQuery))
46+
.uri(constructBodyBasedUri(lookupQueryInfo))
47+
.method(methodName, BodyPublishers.ofString(lookupQueryInfo.getLookupQuery()))
4848
.timeout(Duration.ofSeconds(this.httpRequestTimeOutSeconds));
4949
}
5050

@@ -53,9 +53,15 @@ protected Logger getLogger() {
5353
return log;
5454
}
5555

56-
private URI constructGetUri() {
56+
URI constructBodyBasedUri(LookupQueryInfo lookupQueryInfo) {
57+
StringBuilder resolvedUrl = new StringBuilder(baseUrl);
58+
if (lookupQueryInfo.hasBodyBasedUrlQueryParameters()) {
59+
resolvedUrl.append(baseUrl.contains("?") ? "&" : "?")
60+
.append(lookupQueryInfo.getBodyBasedUrlQueryParameters());
61+
}
62+
5763
try {
58-
return new URIBuilder(baseUrl).build();
64+
return new URIBuilder(resolvedUrl.toString()).build();
5965
} catch (URISyntaxException e) {
6066
throw new RuntimeException(e);
6167
}

src/main/java/com/getindata/connectors/http/internal/table/lookup/GetRequestFactory.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,36 @@ protected Logger getLogger() {
3333
}
3434

3535
/**
36-
* Method for preparing {@link HttpRequest.Builder} for REST GET request, where lookupQuery
37-
* is used as query parameters for example:
36+
* Method for preparing {@link HttpRequest.Builder} for REST GET request, where lookupQueryInfo
37+
* is used as query parameters for GET requests, for example:
3838
* <pre>
3939
* http:localhost:8080/service?id=1
4040
* </pre>
41-
* @param lookupQuery lookup query used for request query parameters.
41+
* or as payload for body-based requests with optional parameters, for example:
42+
* <pre>
43+
* http:localhost:8080/service?id=1
44+
* body payload: { "uid": 2 }
45+
* </pre>
46+
* @param lookupQueryInfo lookup query info used for request query parameters.
4247
* @return {@link HttpRequest.Builder} for given GET lookupQuery
4348
*/
4449
@Override
45-
protected Builder setUpRequestMethod(String lookupQuery) {
50+
protected Builder setUpRequestMethod(LookupQueryInfo lookupQueryInfo) {
4651
return HttpRequest.newBuilder()
47-
.uri(constructGetUri(lookupQuery))
52+
.uri(constructGetUri(lookupQueryInfo))
4853
.GET()
4954
.timeout(Duration.ofSeconds(this.httpRequestTimeOutSeconds));
5055
}
5156

52-
private URI constructGetUri(String lookupQuery) {
57+
URI constructGetUri(LookupQueryInfo lookupQueryInfo) {
58+
StringBuilder resolvedUrl = new StringBuilder(baseUrl);
59+
if (lookupQueryInfo.hasLookupQuery()) {
60+
resolvedUrl.append(baseUrl.contains("?") ? "&" : "?")
61+
.append(lookupQueryInfo.getLookupQuery());
62+
}
63+
5364
try {
54-
return new URIBuilder(baseUrl + "?" + lookupQuery).build();
65+
return new URIBuilder(resolvedUrl.toString()).build();
5566
} catch (URISyntaxException e) {
5667
throw new RuntimeException(e);
5768
}

src/main/java/com/getindata/connectors/http/internal/table/lookup/HttpLookupSourceRequestEntry.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@ public class HttpLookupSourceRequestEntry {
2323
* represent a request body, for example a Json string when PUT/POST requests method was used,
2424
* or it can represent a query parameters if GET method was used.
2525
*/
26-
private final String lookupQuery;
27-
28-
public HttpLookupSourceRequestEntry(HttpRequest httpRequest, String lookupQuery) {
26+
private final LookupQueryInfo lookupQueryInfo;
2927

28+
public HttpLookupSourceRequestEntry(HttpRequest httpRequest, LookupQueryInfo lookupQueryInfo) {
3029
this.httpRequest = httpRequest;
31-
this.lookupQuery = lookupQuery;
30+
this.lookupQueryInfo = lookupQueryInfo;
3231
}
3332
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.getindata.connectors.http.internal.table.lookup;
2+
3+
import java.io.Serializable;
4+
import java.nio.charset.StandardCharsets;
5+
import java.util.Collections;
6+
import java.util.Map;
7+
import java.util.stream.Collectors;
8+
9+
import lombok.Getter;
10+
import lombok.ToString;
11+
12+
import com.getindata.connectors.http.internal.utils.uri.NameValuePair;
13+
import com.getindata.connectors.http.internal.utils.uri.URLEncodedUtils;
14+
15+
/**
16+
* Holds the lookup query for an HTTP request.
17+
* The {@code lookupQuery} either contain the query parameters for a GET operation
18+
* or the payload of a body-based request.
19+
* The {@code bodyBasedUrlQueryParams} contains the optional query parameters of a
20+
* body-based request in addition to its payload supplied with {@code lookupQuery}.
21+
*/
22+
@ToString
23+
public class LookupQueryInfo implements Serializable {
24+
@Getter
25+
private final String lookupQuery;
26+
27+
private final Map<String, String> bodyBasedUrlQueryParams;
28+
29+
public LookupQueryInfo(String lookupQuery) {
30+
this(lookupQuery, null);
31+
}
32+
33+
public LookupQueryInfo(String lookupQuery, Map<String, String> bodyBasedUrlQueryParams) {
34+
this.lookupQuery =
35+
lookupQuery == null ? "" : lookupQuery;
36+
this.bodyBasedUrlQueryParams =
37+
bodyBasedUrlQueryParams == null ? Collections.emptyMap() : bodyBasedUrlQueryParams;
38+
}
39+
40+
public String getBodyBasedUrlQueryParameters() {
41+
return URLEncodedUtils.format(
42+
bodyBasedUrlQueryParams
43+
.entrySet()
44+
.stream()
45+
.map(entry -> new NameValuePair(entry.getKey(), entry.getValue()))
46+
.collect(Collectors.toList()),
47+
StandardCharsets.UTF_8);
48+
}
49+
50+
public boolean hasLookupQuery() {
51+
return !lookupQuery.isBlank();
52+
}
53+
public boolean hasBodyBasedUrlQueryParameters() {
54+
return !bodyBasedUrlQueryParams.isEmpty();
55+
}
56+
57+
}

src/main/java/com/getindata/connectors/http/internal/table/lookup/RequestFactoryBase.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,16 @@ public RequestFactoryBase(
6161
@Override
6262
public HttpLookupSourceRequestEntry buildLookupRequest(RowData lookupRow) {
6363

64-
String lookupQuery = lookupQueryCreator.createLookupQuery(lookupRow);
65-
getLogger().debug("Created Http lookup query: " + lookupQuery);
64+
LookupQueryInfo lookupQueryInfo = lookupQueryCreator.createLookupQuery(lookupRow);
65+
getLogger().debug("Created Http lookup query: " + lookupQueryInfo);
6666

67-
Builder requestBuilder = setUpRequestMethod(lookupQuery);
67+
Builder requestBuilder = setUpRequestMethod(lookupQueryInfo);
6868

6969
if (headersAndValues.length != 0) {
7070
requestBuilder.headers(headersAndValues);
7171
}
7272

73-
return new HttpLookupSourceRequestEntry(requestBuilder.build(), lookupQuery);
73+
return new HttpLookupSourceRequestEntry(requestBuilder.build(), lookupQueryInfo);
7474
}
7575

7676
protected abstract Logger getLogger();
@@ -80,7 +80,7 @@ public HttpLookupSourceRequestEntry buildLookupRequest(RowData lookupRow) {
8080
* @param lookupQuery lookup query used for request query parameters or body.
8181
* @return {@link HttpRequest.Builder} for given lookupQuery.
8282
*/
83-
protected abstract Builder setUpRequestMethod(String lookupQuery);
83+
protected abstract Builder setUpRequestMethod(LookupQueryInfo lookupQuery);
8484

8585
@VisibleForTesting
8686
String[] getHeadersAndValues() {

src/main/java/com/getindata/connectors/http/internal/table/lookup/Slf4JHttpLookupPostRequestCallback.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void call(
4949
httpRequest.uri().toString(),
5050
httpRequest.method(),
5151
headers,
52-
requestEntry.getLookupQuery()
52+
requestEntry.getLookupQueryInfo()
5353
);
5454
} else {
5555
log.info(
@@ -58,7 +58,7 @@ public void call(
5858
httpRequest.uri().toString(),
5959
httpRequest.method(),
6060
headers,
61-
requestEntry.getLookupQuery(),
61+
requestEntry.getLookupQueryInfo(),
6262
response,
6363
response.body().replaceAll(ConfigUtils.UNIVERSAL_NEW_LINE_REGEXP, "")
6464
);

src/main/java/com/getindata/connectors/http/internal/table/lookup/querycreators/ElasticSearchLiteQueryCreator.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.getindata.connectors.http.LookupArg;
99
import com.getindata.connectors.http.LookupQueryCreator;
10+
import com.getindata.connectors.http.internal.table.lookup.LookupQueryInfo;
1011
import com.getindata.connectors.http.internal.table.lookup.LookupRow;
1112

1213
/**
@@ -35,14 +36,15 @@ private static String processLookupArg(LookupArg arg) {
3536
}
3637

3738
@Override
38-
public String createLookupQuery(RowData lookupDataRow) {
39-
39+
public LookupQueryInfo createLookupQuery(RowData lookupDataRow) {
4040
Collection<LookupArg> lookupArgs = lookupRow.convertToLookupArgs(lookupDataRow);
4141

4242
var luceneQuery = lookupArgs.stream()
4343
.map(ElasticSearchLiteQueryCreator::processLookupArg)
4444
.collect(Collectors.joining(ENCODED_SPACE + "AND" + ENCODED_SPACE));
4545

46-
return luceneQuery.isEmpty() ? "" : ("q=" + luceneQuery);
46+
String lookupQuery = luceneQuery.isEmpty() ? "" : ("q=" + luceneQuery);
47+
48+
return new LookupQueryInfo(lookupQuery);
4749
}
4850
}

src/main/java/com/getindata/connectors/http/internal/table/lookup/querycreators/GenericGetQueryCreator.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import com.getindata.connectors.http.LookupArg;
1010
import com.getindata.connectors.http.LookupQueryCreator;
11+
import com.getindata.connectors.http.internal.table.lookup.LookupQueryInfo;
1112
import com.getindata.connectors.http.internal.table.lookup.LookupRow;
1213
import com.getindata.connectors.http.internal.utils.uri.NameValuePair;
1314
import com.getindata.connectors.http.internal.utils.uri.URLEncodedUtils;
@@ -25,14 +26,17 @@ public GenericGetQueryCreator(LookupRow lookupRow) {
2526
}
2627

2728
@Override
28-
public String createLookupQuery(RowData lookupDataRow) {
29+
public LookupQueryInfo createLookupQuery(RowData lookupDataRow) {
2930

3031
Collection<LookupArg> lookupArgs = lookupRow.convertToLookupArgs(lookupDataRow);
3132

32-
return URLEncodedUtils.format(
33-
lookupArgs.stream()
34-
.map(arg -> new NameValuePair(arg.getArgName(), arg.getArgValue()))
35-
.collect(Collectors.toList()),
36-
StandardCharsets.UTF_8);
33+
String lookupQuery =
34+
URLEncodedUtils.format(
35+
lookupArgs.stream()
36+
.map(arg -> new NameValuePair(arg.getArgName(), arg.getArgValue()))
37+
.collect(Collectors.toList()),
38+
StandardCharsets.UTF_8);
39+
40+
return new LookupQueryInfo(lookupQuery);
3741
}
3842
}

src/main/java/com/getindata/connectors/http/internal/table/lookup/querycreators/GenericJsonQueryCreator.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.apache.flink.util.FlinkRuntimeException;
88

99
import com.getindata.connectors.http.LookupQueryCreator;
10+
import com.getindata.connectors.http.internal.table.lookup.LookupQueryInfo;
1011
import com.getindata.connectors.http.internal.utils.SerializationSchemaUtils;
1112

1213
/**
@@ -33,9 +34,12 @@ public GenericJsonQueryCreator(SerializationSchema<RowData> jsonSerialization) {
3334
* @return Json string created from lookupDataRow argument.
3435
*/
3536
@Override
36-
public String createLookupQuery(RowData lookupDataRow) {
37+
public LookupQueryInfo createLookupQuery(RowData lookupDataRow) {
3738
checkOpened();
38-
return new String(jsonSerialization.serialize(lookupDataRow), StandardCharsets.UTF_8);
39+
String lookupQuery =
40+
new String(jsonSerialization.serialize(lookupDataRow), StandardCharsets.UTF_8);
41+
42+
return new LookupQueryInfo(lookupQuery);
3943
}
4044

4145
private void checkOpened() {

0 commit comments

Comments
 (0)