REST Client
This library is for integration scenario to programmatically invoke the REST API (Restful Objects Viewer) of an Apache Causeway application, using the restfulobjects protocol.
A common use case would be to consume information from some external system, for example uploading a scanned PDF or a representation of an incoming invoice.
Initializing
We create a RestfulClient using a static factory method that accepts a RestfulClientConfig object.
For example:
-
to create a
RestfulClientthat authenticates itself using basic auth:RestfulClient restfulClient = RestfulClient.ofConfig( RestfulClientConfig.builder() .restfulBaseUrl("localhost:8080") .authenticationMode(AuthenticationMode.BASIC) .basicAuthUser("xxxx") .basicAuthPassword("xxxx") .build()); -
to create a
RestfulClientthat authenticates itself using OAuth2 (Azure):RestfulClient restfulClient = RestfulClient.ofConfig( RestfulClientConfig.builder() .restfulBaseUrl("localhost:8080") .authenticationMode(AuthenticationMode.OAUTH2_AZURE) .oauthTenantId("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") (1) .oauthClientId("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") (2) .oauthClientSecret("xxXXx~XXxxXx-XxXX.XxXX.XxxXX-XxxXX~XxxXX") (3) .build());For the Causeway app being connected to, this will need to be configured appropriately; see Spring Oauth2 extension for more details. -
It’s also possible to create a
RestfulClientthat uses some other arbitrary authentication mechanism:RestfulClient restfulClient = RestfulClient.ofConfig( RestfulClientConfig.builder() (1) .restfulBaseUrl("localhost:8080") .build(), new AuthorizationHeaderFactory() { @Override public String create() { return "some authorization header"; (2) } }); );1 No need to provide any authentication details in the RestfulClientConfig2 Used as the value of the AuthorizationHTTP header.
Making a Request
Invocation.Builder request = (1)
restfulClient.request("services/customers.CustomerApi/actions/findAll/invoke"); (2)
Response response = request.get(); (3)
// Response response = request.put(...); (3)
// Response response = request.post(...); (3)
// Response response = request.delete(); (3)
| 1 | instance of javax.ws.rs.client.Invocation.Builder |
| 2 | specify the endpoint |
| 3 | call appropriately using either HTTP GET, PUT, POST or DELETE.
The PUT and POST methods will require an entity body, and all might require additional headers to be set. |
Refining the Client
The RestfulClient delegates to an instance of javax.ws.rs.client.Client to actually perform the invocation.
The configuration of this underlying Client can be refined by providing a "refining" operator of ClientBuilder, when the RestfulClient is created.
For example, to specify a connection and read timeout:
RestfulClient restfulClient = RestfulClient.ofConfig(
RestfulClientConfig.builder()
.restfulBaseUrl("localhost:8080")
//... (1)
.build(),
clientBuilder -> (2)
clientBuilder.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(2, TimeUnit.SECONDS)
);
| 1 | authentication details omitted |
| 2 | instance of javax.ws.rs.client.ClientBuilder |