Prefix function names with spring-
* Add `spring-` prefix to function names Fixes: #9 This commit renames each sub-module in the common, consumer, function and supplier groups with a prefix of `spring-`. * Update README.adoc links to new prefixed names
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
/*
|
||||
* Copyright 2018-2022 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.cloud.fn.http.request;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.integration.config.IntegrationConverter;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
import org.springframework.web.util.DefaultUriBuilderFactory;
|
||||
import org.springframework.web.util.UriBuilderFactory;
|
||||
|
||||
|
||||
/**
|
||||
* Configuration for a {@link Function} that makes HTTP requests to a resource and for
|
||||
* each request, returns a {@link ResponseEntity}.
|
||||
*
|
||||
* @author David Turanski
|
||||
* @author Sunny Hemdev
|
||||
* @author Corneil du Plessis
|
||||
**/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@EnableConfigurationProperties(HttpRequestFunctionProperties.class)
|
||||
public class HttpRequestFunctionConfiguration {
|
||||
|
||||
@Bean
|
||||
public HttpRequestFunction httpRequestFunction(WebClient.Builder webClientBuilder, HttpRequestFunctionProperties properties) {
|
||||
return new HttpRequestFunction(webClientBuilder.build(), properties);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@IntegrationConverter
|
||||
public Converter<String, HttpMethod> httpMethodConverter() {
|
||||
return new HttpMethodConverter();
|
||||
}
|
||||
|
||||
/**
|
||||
* Function that accepts a {@code Flux<Message<?>>} containing body and headers and
|
||||
* returns a {@code Flux<ResponseEntity<?>>}.
|
||||
*/
|
||||
public static class HttpRequestFunction implements Function<Message<?>, Object> {
|
||||
|
||||
private final WebClient webClient;
|
||||
|
||||
private final UriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory();
|
||||
|
||||
private final HttpRequestFunctionProperties properties;
|
||||
|
||||
public HttpRequestFunction(WebClient webClient, HttpRequestFunctionProperties properties) {
|
||||
this.webClient = webClient;
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object apply(Message<?> message) {
|
||||
return this.webClient
|
||||
.method(resolveHttpMethod(message))
|
||||
.uri(uriBuilderFactory.uriString(resolveUrl(message)).build())
|
||||
.bodyValue(resolveBody(message))
|
||||
.headers(httpHeaders -> httpHeaders.addAll(resolveHeaders(message)))
|
||||
.retrieve()
|
||||
.toEntity(properties.getExpectedResponseType())
|
||||
.map(responseEntity -> properties.getReplyExpression().getValue(responseEntity))
|
||||
.timeout(Duration.ofMillis(properties.getTimeout()))
|
||||
.block();
|
||||
}
|
||||
|
||||
private String resolveUrl(Message<?> message) {
|
||||
return properties.getUrlExpression().getValue(message, String.class);
|
||||
}
|
||||
|
||||
private HttpMethod resolveHttpMethod(Message<?> message) {
|
||||
return properties.getHttpMethodExpression().getValue(message, HttpMethod.class);
|
||||
}
|
||||
|
||||
private Object resolveBody(Message<?> message) {
|
||||
return properties.getBodyExpression() != null ? properties.getBodyExpression().getValue(message)
|
||||
: message.getPayload();
|
||||
}
|
||||
|
||||
private HttpHeaders resolveHeaders(Message<?> message) {
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
if (properties.getHeadersExpression() != null) {
|
||||
Map<?, ?> headersMap = properties.getHeadersExpression().getValue(message, Map.class);
|
||||
for (Map.Entry<?, ?> header : headersMap.entrySet()) {
|
||||
if (header.getKey() != null && header.getValue() != null) {
|
||||
headers.add(header.getKey().toString(),
|
||||
header.getValue().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
return headers;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class HttpMethodConverter implements Converter<String, HttpMethod> {
|
||||
|
||||
@Override
|
||||
public HttpMethod convert(String source) {
|
||||
return HttpMethod.valueOf(source);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
* Copyright 2015-2022 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.cloud.fn.http.request;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.expression.Expression;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.integration.expression.FunctionExpression;
|
||||
import org.springframework.integration.expression.ValueExpression;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
/**
|
||||
* Configuration properties for the Http Client Processor module.
|
||||
*
|
||||
* @author Waldemar Hummer
|
||||
* @author Mark Fisher
|
||||
* @author Christian Tzolov
|
||||
* @author Artem Bilan
|
||||
* @author David Turanski
|
||||
* @author Sunny Hemdev
|
||||
*/
|
||||
@Validated
|
||||
@ConfigurationProperties("http.request")
|
||||
public class HttpRequestFunctionProperties {
|
||||
|
||||
private static final Class<?> DEFAULT_RESPONSE_TYPE = String.class;
|
||||
|
||||
/**
|
||||
* The type used to interpret the response.
|
||||
*/
|
||||
private Class<?> expectedResponseType = DEFAULT_RESPONSE_TYPE;
|
||||
|
||||
/**
|
||||
* Request timeout in milliseconds.
|
||||
*/
|
||||
private long timeout = 30_000;
|
||||
|
||||
/**
|
||||
* A SpEL expression against incoming message to determine the URL to use.
|
||||
*/
|
||||
private Expression urlExpression;
|
||||
|
||||
/**
|
||||
* A SpEL expression to derive the request method from the incoming message.
|
||||
*/
|
||||
private Expression httpMethodExpression = new ValueExpression(HttpMethod.GET);
|
||||
|
||||
/**
|
||||
* A SpEL expression to derive the request body from the incoming message.
|
||||
*/
|
||||
private Expression bodyExpression;
|
||||
|
||||
/**
|
||||
* A SpEL expression used to derive the http headers map to use.
|
||||
*/
|
||||
private Expression headersExpression;
|
||||
|
||||
/**
|
||||
* A SpEL expression used to compute the final result, applied against the whole http
|
||||
* {@link org.springframework.http.ResponseEntity}.
|
||||
*/
|
||||
private Expression replyExpression = new FunctionExpression<ResponseEntity>(ResponseEntity::getBody);
|
||||
|
||||
@NotNull
|
||||
public Expression getUrlExpression() {
|
||||
return urlExpression;
|
||||
}
|
||||
|
||||
public void setUrlExpression(Expression urlExpression) {
|
||||
this.urlExpression = urlExpression;
|
||||
}
|
||||
|
||||
public Expression getHttpMethodExpression() {
|
||||
return httpMethodExpression;
|
||||
}
|
||||
|
||||
public void setHttpMethodExpression(Expression httpMethodExpression) {
|
||||
this.httpMethodExpression = httpMethodExpression;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Class<?> getExpectedResponseType() {
|
||||
return expectedResponseType;
|
||||
}
|
||||
|
||||
public void setExpectedResponseType(Class<?> expectedResponseType) {
|
||||
this.expectedResponseType = expectedResponseType;
|
||||
}
|
||||
|
||||
public long getTimeout() {
|
||||
return this.timeout;
|
||||
}
|
||||
|
||||
public void setTimeout(long timeout) {
|
||||
this.timeout = timeout;
|
||||
}
|
||||
|
||||
public Expression getBodyExpression() {
|
||||
return bodyExpression;
|
||||
}
|
||||
|
||||
public void setBodyExpression(Expression bodyExpression) {
|
||||
this.bodyExpression = bodyExpression;
|
||||
}
|
||||
|
||||
public Expression getHeadersExpression() {
|
||||
return headersExpression;
|
||||
}
|
||||
|
||||
public void setHeadersExpression(Expression headersExpression) {
|
||||
this.headersExpression = headersExpression;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Expression getReplyExpression() {
|
||||
return replyExpression;
|
||||
}
|
||||
|
||||
public void setReplyExpression(Expression replyExpression) {
|
||||
this.replyExpression = replyExpression;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user