Request Response Handlers
When integrating with REST APIs using the Service Registry
with Service Type
set as REST
,
the structure of the requests and responses may not always match the expectation of the process or case.
To address this issue, Flowable provides support for Request / Response Handlers
.
These handlers can be configured using scripts or expressions to manipulate data and align it with the required request/response format.
Scripts as Request and Response Handlers
Consider an example where an API returns Customer
objects in the following format:
{
"id" : "johndoe",
"firstName": "John",
"lastName": "Doe"
}
To retrieve a customer object using the Service Registry, configure a service operation with a GET API call to the Customer Service:
In the screenshot above, the API expects an id
as input and returns the id
, firstName
and lastName
of the customer.
However, let's assume we also require a new field called fullName
, which should be calculated based on the firstName
and lastName
fields.
In this case, you can configure a Response handler
script:
// Retrieve Response Body and transform to JSON object
var response = flw.json.stringToJson(flwHttpResponse.getBody());
// Get attributes from response body
var firstName = response.path("firstName").asString();
var lastName = response.path("lastName").asString();
// Add a new attribute to the response body
var fullName = firstName + " " + lastName;
response.putString("fullName", fullName);
// Set response body
var jsonResponse = flw.json.jsonToString(response);
flwHttpResponse.setBody(jsonResponse);
In the above example, the Response handler
takes the response, transforms it to a JSON object, calculates the fullName
field based on the firstName
and lastName
, adds it to the response, and sets the modified response body using flwHttpResponse
.
The Service Registry executes the API, applies the Response handler
, and parses the result for the output parameters.
Since the fullName
field is now part of the response, it will be returned seamlessly as an output parameter.
Expression-based Request and Response Handlers
Instead of using a script, it is also possible to use expressions instead. This allows to execute a custom Java method.
It is not necessary to implement a specific interface, the method is executed as is and doesn't expect a specific return type.
In the expression the variables flwHttpRequest
, flwHttpResponse
, flwServiceOperation
and flwServiceDefinitionModel
are available.
An example for such an expression is:
${myCustomUtil.addFullNameToBody(flwHttpResponse)}
While the method needs then to implement the signature: void addFullNameToBody(HttpResponse httpResponse)
.
flwHttpRequest
is an instance of the classorg.flowable.http.common.api.HttpRequest
flwHttpResponse
is an instance of the classorg.flowable.http.common.api.HttpResponse
flwServiceOperation
is an instance of the classcom.flowable.serviceregistry.api.repository.ServiceOperation
flwServiceDefinitionModel
is an instance of the classcom.flowable.serviceregistry.api.repository.ServiceDefinitionModel