Hi Jean,
The JAX-RS has full support for web forms, it should be fairly easy to do
with WebClient for example:
import javax.ws.rs.core.Form;
import javax.ws.rs.core.Response;
final WebClient client = WebClient
.create(address)
.accept("application/json")
.type("application/x-www-form-urlencoded")
.path("/");
final Form form = new Form();
form.param("token", accessToken);
try (Response response = client.post(form)) {
...
}
I hope it answers your question, thank you.
Best Regards,
Andriy Redko
> Hi Andriy,
> The 'ugly' solution I have is to pass the (url endocded) FORM data as a
> string to my interface method, which is then written to the body content.
> E.g.:
> //01.Creating a static threadsafe client proxy
> private static OidcProviderApi apiProxy;
> protected static synchronized OidcProviderApi getApiProxy() {
> if (apiProxy == null) {
> String oidcBaseAddress =
> Configuration.getInstance().getItem("oidc.introspection.uri");
> apiProxy = getThreadsafeProxy(oidcBaseAddress);
> }
> return apiProxy;
> }
> private static OidcProviderApi getThreadsafeProxy(String
> oidcBaseAddress) {
> JacksonJsonProvider provider = new JacksonJsonProvider(new
> CustomObjectMapper());
> List<JacksonJsonProvider> providers = new
> ArrayList<JacksonJsonProvider>();
> providers.add(provider);
> //Create a threadsafe proxy for the API resource
> final JAXRSClientFactoryBean factory = new
> JAXRSClientFactoryBean();
> factory.setAddress(oidcBaseAddress);
> factory.setServiceClass(OidcProviderApi.class);
> factory.setProviders(providers);
> factory.getOutInterceptors().add(new LoggingOutInterceptor());
> factory.getInInterceptors().add(new LoggingInInterceptor());
> factory.setThreadSafe(true);
> OidcProviderApi api = factory.create(OidcProviderApi.class);
> ClientConfiguration config = WebClient.getConfig(api);
> addTLSClientParameters(config.getHttpConduit());
> return api;
> }
> //02.Sending the POST request with
> 'application/x-www-form-urlencoded' body
> content containing FORM data
> //It takes the access token as input and constructs an (url encoded)
> string
> representing the FORM data having the
> // parameters: token, token_type_hint, client_assertion_type and
> client_assertion
> public Response validateAccessToken(String token) throws
> MvgBusinessFatalException {
> StringBuilder bldr = new
> StringBuilder("token=").append(token);
> bldr.append("&token_type_hint=access_token");
>
> bldr.append("&client_assertion_type=").append(URLEncoder.encode("urn:ietf:params:oauth:client-assertion-type:jwt-bearer","UTF-8"));
> String clientAssertion = <A signed JWT token>;
> bldr.append("&client_assertion=").append(clientAssertion);
> String urlEncodedFormData = bldr.toString();
> OidcProviderApi apiClient = getApiProxy();
> ClientConfiguration config = WebClient.getConfig(apiClient);
>
> config.getHttpConduit().getClient().setContentType("application/x-www-form-urlencoded");
> return apiClient.validateAccessToken(urlEncodedFormData);
> }
> This works, but doesn't really look nice.
> J.P.
> -----Original Message-----
> From: Jean Pierre URKENS <[email protected]>
> Sent: dinsdag 19 september 2023 9:48
> To: 'Andriy Redko' <[email protected]>
> Subject: CXF JAX-RS client: setting content-type for a specific method in
> outgoing request
> Hi Andriy,
> I've a server that expects an HTTP POST request having a body content of
> mediatype 'application/x-www-form-urlencoded' and produces a response of
> mediatype 'application/json'.
> I am using Apache CXF-v3.5.6 but I am not sure on how to create a JAXRS
> client that is able to send a POST with an
> 'application/x-www-form-urlencoded' body content.
> Are there any examples within CXF to realize this.
> Thanks for any feedback.
> Regards,
> J.P. Urkens