Composite Rest avec la SOA Suite 12c

Depuis la version 12.2.1, Oracle a introduit le RestAdapter dans le designer des Composites de la SOA Suite et celui de l’OSB, ce dernier permettant d’implémenter des flux et processus en REST de bout en bout.

Javascript est également proposé comme langage de mapping et de transformation des objets JSON.
Dans cet article, nous allons faire un exemple simple qui illustre l’utilisation de ces nouvelles fonctionnalités.

 

Quelques considérations à prendre en compte

  • Dans les composites, seul BPEL permet de s’interfacer via REST que ce soit en inbound ou outbound
  • La définition des endpoints REST n’est possible qu’avec WADL, les autres formats tels que OpenAPI ou RAML ne sont pas supportés
  • Les objets JSON ne sont pas définis, le parsing et la construction avec Javascript se fait donc sans assistance contrairement aux mappings XML

 

Implémentation

Premièrement, on crée un service Rest avec le Rest Adapter, le wizard permet de créer une définition en se basant sur un WADL existant, sinon il faut créer les ressources et les verbes HTTP

<?xml version = '1.0' encoding = 'UTF-8'?>
<application xmlns:soa="http://www.oracle.com/soa/rest" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://wadl.dev.java.net/2009/02">
   <doc title="PetStoreService">PetStoreRest</doc>
   <resources>
      <resource path="/pet">
         <method name="POST" soa:name="addPet">
            <doc title="POST addPet">Add a new pet to the store</doc>
            <request>
               <representation mediaType="application/json"/>
            </request>
            <response status="201"/>
            <response status="405"/>
         </method>
      </resource>
      <resource path="/pet/{petId}">
         <method name="GET" soa:name="getPetById">
            <doc title="GET getPetById">Returns a single pet</doc>
            <request>
               <param name="petId" style="template" type="xsd:long"/>
            </request>
            <response status="200">
               <representation mediaType="application/json"/>
            </response>
            <response status="400"/>
         </method>
      </resource>
   </resources>
</application>

Ensuite, pour créer un processus BPEL avec une interface REST, il suffit de glisser le composant et choisir l’interface précédemment créée

Si on veut implémenter les deux opérations dans le même Processus, c’est possible. Pour ce faire, on déclare les deux opérations dans la section méthodes.

On peut le faire manuellement en combinant les actions pick & OnMessage sur un processus BPEL déjà créé.

Le flux change de forme habituelle, l’action receive n’est plus présente et a laissé place à pick.

 

Utilisation de Javascript

Pour tester l’implémentation de JavaScript, on va construire une réponse simple pour le service getPetById, on va construire un Objet JSON de base avec l’id issu de la requête

{
    "id": "34"
}

Premièrement, on déclare une variable « petId » qui va récupérer la valeur de l’URL, cette variable va être mappée avec le paramètre PATH de la méthode GET via la propriété rest.template.petId

Ensuite, on affecte la valeur issue de la requête à un attribut « id » dans le JSON de réponse

Enfin, la méthode addPet ne sera pas implémentée, on va donc placer le code HTTP 405 pour informer les consommateurs de l’API.
Dans l’action reply, c’est la propriété « rest.binding.http.code » que l’on va manipuler.

Ci-dessous les tests des deux opérations après déploiement