Showing posts with label convert. Show all posts
Showing posts with label convert. Show all posts

Sunday, June 18, 2017

Main Idea Using OSB To Handle Convertion From REST to SOAP

Pada beberapa waktu yang lalu kebetulan saya mendapat kesempatan untuk memberikan training kecil tentang OSB khususnya pada part Message Flow. Harapan dari training ini mereka dapat menggunakan melakukan convert dari REST ke SOAP maupun sebaliknya.

Pada dasarnya ada 2 jenis pengelompokan jika kita akan melakukan convert dari REST ke SOAP yaitu :
  • Mengirim data melalui Query Param (Method GET)
  • Mengirim data melalui Payload (Method POST,PUT)
Jika digambarkan flow untuk method GET kira kira akan seperti ini.
  1. Dapatkan HttpHeader yang dikirim.

  2. Buat Conditional Branch Untuk menghandle beberapa HttpHeader yang didapat.
  3. Dapatkan Query Param yang dikirim
  4. Buat payload yang sesuai dengan kebutuhan Business Service dan masukkan value yang didapat dari query param.
  5. Invoke Business Service
  6. Jika sudah mendapatkan response dari Business Service, olah response tersebut dengan melakukan penghilangan SOAP Envelope. Ini dapat dilakukan dengan menggunakan XSLT Resource.
  7. Jika sudah dihilangkan, lakukan convert menggunakan tools yang biasa dipergunakan, kalau dalam kasus saya, saya menggunakan Java untuk menghandle convert nya.
  8. Replace isi variable body dengan menggunakan hasil convert tersebut.
Sedangkan untuk flow method POST,PUT kira kira akan seperti berikut.
  1. Dapatkan HttpHeader yang dikirim.

  2. Buat Conditional Branch Untuk menghandle beberapa HttpHeader yang didapat.
  3. Jangan lupa tambahkan OPTIONS Method untuk menghandle agar service yang kita buat sukses diexecute. Kuncinya tambahkan Transport Header pada flow OPTIONS.
  4. Karena data ada di dalam payload dan bentuknya sudah JSON, maka kita tinggal lakukan convert dari JSON ke XML. Jika sudah maka kita akan punya payload berbentuk xml.
  5. Namun sebelum kita mengirim data ke Business Service, terlebih dahulu payload xml nya harus kita manipulasi agar bentuknya sama seperti Business Service yang akan kita invoke. Caranya dengan menambahkan namespace pada payload xml nya.
  6. Invoke Business Service
  7. Jika sudah mendapatkan response dari Business Service, olah response tersebut dengan melakukan penghilangan SOAP Envelope. Ini dapat dilakukan dengan menggunakan XSLT Resource.


  8. Jika sudah dihilangkan, lakukan convert menggunakan tools yang biasa dipergunakan, kalau dalam kasus saya, saya menggunakan Java untuk menghandle convert nya.
  9. Replace isi variable body dengan menggunakan hasil convert tersebut.
Kira kira seperti itu inti dari convert dari REST ke SOAP menggunakan OSB.
Semoga bermanfaat !

Reference sample file yang dibutuhkan:
- AddNamespace

Tuesday, September 16, 2014

Convert SOAP ke REST & REST ke SOAP Menggunakan OSB Part 2

Lanjutan dari part 1...

  1. Sebelum melanjutkan proses, kita akan terlebih dahulu membuat XSLT script yang akan digunakan nanti pada proses transforming di dalam OSB. Buat XSLT dan beri nama xslt_1 & xslt_2 & xslt_add_namespace. Berikut code untuk xslt_1 :

    <xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
    <xsl:copy>
    <xsl:output indent="yes" /> <xsl:template match="@* | node()">
    <xsl:template match="soapenv:*">
    <xsl:apply-templates select="@* | node()" /> </xsl:copy> </xsl:template>
    </xsl:stylesheet>
    <xsl:apply-templates select="@* | node()" />
    </xsl:template>

    Berikut code untuk xslt_2 :

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="*"> <xsl:element name="{local-name()}">
    </xsl:template>
    <xsl:apply-templates select="@* | node()" /> </xsl:element> <xsl:template match="@*">
    </xsl:template>
    <xsl:attribute name="{local-name()}"> <xsl:value-of select="." /> </xsl:attribute>
    </xsl:stylesheet>
    <xsl:template match="text() | comment() | processing-instruction()"> <xsl:copy />
    </xsl:template>

    Berikut code untuk xslt_add_namespace :

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*"> <xsl:copy>
    </xsl:template>
    <xsl:apply-templates select="node()|@*" /> </xsl:copy> <xsl:template match="*">
    <xsl:apply-templates select="node()|@*" />
    <xsl:element name="inq:{local-name()}" namespace="www.nostratech.com/xsd/inquiry"> </xsl:element> </xsl:template>
    </xsl:stylesheet>

    Sedikit penjelasan, untuk melakukan convert dari SOAP ke REST kita harus terlebih dahulu membuang soap envelope & namespace yang ada dalam body SOAP menggunakan xslt_1 & xslt_2 sehingga hanya tersisa xml body yang diperlukan sebagai payload input untuk REST xml kita. Sedangkan untuk proses convert dari REST ke SOAP, kita memerlukan xslt_add_namespace untuk menambahkan namespace sebelum di passing kembali ke SOAP body.

  2. Langkah selanjutnya kita akan melakukan Routing & Transform pada Proxy Service yang telah kita buat. Klik Edit Message Flow, kemudian tambahkan pipeline air.


    Tambahkan Stage dimasing masing Request & Response Pipeline.


  3. Langkah selanjutnya ialah mengedit Stage yang ada dibagian Request terlebih dahulu. Klik edit stage. Tambahkan Assign sebanyak 2 buah.




  4. Jika sudah, pada Assign pertama, klik Expression, kemudian pilih XSLT Resource, pilih xslt_1 yang telah kita buat tadi. Pada bagian Input Document isi dengan :

     $body/inq:accountInquiryRequest  
    

    Kemudian klik Save. Setelah itu isi input variable nya dengan var1. Tujuan nya adalah menyimpan proses hasil xslt_1 yang diambil dari $body/inq:accountInquiryRequest ke var1.


  5. Pada Assign kedua, klik Expression, kemudian pilih XSLT Resource, pilih xslt_2 yang telah kita buat tadi. Pada bagian Input Document isi dengan :

     $var1  
    

    Kemudian klik Save. Setelah itu isi input variable dengan var2.


  6. Tambahkan Action dengan Service Callout.

    Klik Service, kemudian pilih Business Service yang telah kita buat tadi. Jika sudah maka tampilan nya akan seperti berikut :
    Pada bagian Request Document Variable isi dengan var2, dan pada bagian Response Document Variable isi dengan var3. Jika sudah Klik Save.


  7. Langkah selanjutnya ialah mengedit Stage yang ada dibagian Response. Klik Edit Stage. Tambahkan Assign sebanyak 2 buah.


  8. Pada Assign pertama, Klik Expression, kemudian pilih XSLT Resource, pilih xslt_1 yang telah kita buat tadi. Pada bagian Input Document isi dengan :

     $var3  
    

    Kemudian klik Save.

    Setelah itu isi input variablenya dengan var4.
  9. Pada Assign kedua, Klik Expression, kemudian pilih XSLT Resource, pilih xslt_add_namespace yang telah kita buat tadi. Pada bagian Input Document isi dengan :

     $var4  
    

    Kemudian klik Save.

    Setelah itu isi input variable nya dengan var5.
  10. Tambahkan Action Replace. Kemudian pada bagian XPath isi dengan :

     .  
    

    Kemudian Save.
    Pada bagian in Variable di isi dengan :

     body  
    

    Pada bagian with, di isi dengan :

     $var5  
    

    Kemudian pilih Replace Node Content.
    Jika sudah klik Save.

    Commit Session, kemudian bisa kita test.
  11. Ketika Test, bisa memakai contoh payload sebagai berikut :

     <inq:accountInquiryRequest xmlns:inq="http://www.nostratech.com/xsd/inquiry">  
       <inq:bankCode>123</inq:bankCode>  
       <inq:accountNo>1234567890</inq:accountNo>  
       <inq:accountCurrency>IDR</inq:accountCurrency>  
       <inq:messageId>1234567890</inq:messageId>  
       <inq:rqDatetime>2008-09-29T08:49:45</inq:rqDatetime>  
     </inq:accountInquiryRequest>  
    

    Kira kira hasilnya akan sepertinya ini.

     <soapenv:Envelope      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">  
          <soap:Header      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
          </soap:Header>  
          <soapenv:Body>  
               <inq:accountInquiryRequest      xmlns:inq="www.nostratech.com/xsd/inquiry">  
                    <inq:bankCode>123</inq:bankCode>  
                    <inq:accountNo>1234567890</inq:accountNo>  
                    <inq:accountCurrency>IDR</inq:accountCurrency>  
                    <inq:messageId>1234567890</inq:messageId>  
                    <inq:rqDatetime>2008-09-29T08:49:45</inq:rqDatetime>  
               </inq:accountInquiryRequest>  
          </soapenv:Body>  
     </soapenv:Envelope>  
    

     
    Demikianlah cara untuk menconvert dari SOAP service ke REST & Menggembalikan REST ke SOAP. Semoga bermanfaat !!

Convert SOAP ke REST & REST ke SOAP Menggunakan OSB Part 1

Pada kesempatan ini saya ingin berbagi tentang cara mengconvert SOAP ke REST & REST ke SOAP menggunakan OSB. Sebagai contoh case, saya mempunyai client yang menggunakan SOAP Webservice, dan saya sendiri menggunakan RESTful Webservice. Bagaimana cara SOAP & REST saling berkomunikasi?  Dengan menggunakan OSB saya akan coba untuk mengkomunikasikan antar SOAP & REST.
  1. Pertama-tama kita buat project baru pada OSB kita, setelah diberinama, kemudian kita buat folder baru yang diberi nama XSD, didalam nya kita akan buat xml schema & WSDL yang akan dipakai oleh proxyservice yang akan kita buat nanti.
    Berikut contoh xml schema yang saya pakai, dan beri nama xml_blog.xsd

     <?xml version="1.0" encoding="ISO-8859-1" ?>  
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
           xmlns="http://www.nostratech.com/xsd/inquiry"  
           targetNamespace="http://www.nostratech.com/xsd/inquiry"  
           elementFormDefault="qualified">  
      <xsd:element name="accountInquiryRequest">  
       <xsd:complexType>  
        <xsd:sequence>  
         <xsd:element name="bankCode" type="xsd:string"/>  
         <xsd:element name="accountNo" type="xsd:string"/>  
         <xsd:element name="accountCurrency" type="xsd:string"/>  
         <xsd:element name="messageId" type="xsd:string"/>  
         <xsd:element name="rqDatetime" type="xsd:dateTime"/>  
        </xsd:sequence>  
       </xsd:complexType>  
      </xsd:element>  
      <xsd:element name="accountInquiryResponse">  
       <xsd:complexType>  
        <xsd:sequence>  
         <xsd:element name="responseCode" type="xsd:string"/>  
         <xsd:element name="responseDesc" type="xsd:string"/>  
         <xsd:element name="accountName" type="xsd:string"/>  
         <xsd:element name="currency" type="xsd:string"/>  
         <xsd:element name="balanceSign" type="xsd:string"/>  
         <xsd:element name="balance" type="xsd:integer"/>  
         <xsd:element name="accountStatus" type="xsd:string"/>  
         <xsd:element name="productType" type="xsd:string"/>  
        </xsd:sequence>  
       </xsd:complexType>  
      </xsd:element>  
     </xsd:schema>  
    

    Berikut contoh WSDL yang saya pakai.

     <?xml version="1.0" encoding="UTF-8" ?>
    <definitions targetNamespace="urn:WSDLDocument1"
                 xmlns="http://schemas.xmlsoap.org/wsdl/"
                 xmlns:tns="urn:WSDLDocument1"
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                 xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
                 xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
                 xmlns:wncxi="http://www.nostratech.com/xsd/inquiry">
      <types>
        <xsd:schema targetNamespace="urn:WSDLDocument1/types"
                    elementFormDefault="qualified"/>
        <xsd:schema>
          <xsd:import schemaLocation="../../../xml_blog.xsd"
                      namespace="http://www.nostratech.com/xsd/inquiry"/>
        </xsd:schema>
      </types>
      <portType name="accountInquiry">
        <operation name="accountInquiryRequestOperation">
          <input message="tns:accountInquiry_accountInquiryRequest"/>
          <output message="tns:accountInquiry_accountInquiryResponse"/>
        </operation>
      </portType>
      <message name="accountInquiry_accountInquiryRequest">
        <part name="part" element="wncxi:accountInquiryRequest"/>
      </message>
      <message name="accountInquiry_accountInquiryResponse">
        <part name="part" element="wncxi:accountInquiryResponse"/>
      </message>
      <binding name="accountInquiryBinding" type="tns:accountInquiry">
        <soap:binding style="document"
                      transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="accountInquiryRequestOperation">
          <soap:operation style="document"
                          soapAction="urn:WSDLDocument1/accountInquiryRequestOperation"/>
          <input>
            <soap:body use="literal" parts="part"/>
          </input>
          <output>
            <soap:body use="literal" parts="part"/>
          </output>
        </operation>
      </binding>
      <service name="accountInquiry">
        <port name="accountInquiryPort" binding="tns:accountInquiryBinding">
          <soap:address location="http://www.example.com"/>
        </port>
      </service>
    </definitions>
    
  2. Setelah WSDL & xml schema dibuat, kita akan buat Businness Service dengan menggunakan endpoint REST yang sudah kita jelaskan pada awal tadi. Buat Businness Service, Service type nya menggunakan Message Service. Untuk Request & Response Type nya menggunakan xml. Kemudian masukkan endpoint REST service yang kita punya. Jika sudah bisa langsung di klik Last dan Pilih Save.



  3. Jika sudah membuat Business Service, maka selanjutnya yang dibuat adalah Proxy Service. Untuk Service Type nya menggunakan WSDL Service, kita gunakan WSDL yang telah kita buat di awal. Jika sudah kita bisa define endpoint untuk proxy service yang akan kita buat & pilih bagian get all header nya dibuat jadi yes. Jika sudah bisa langsung di klik Last dan Pilih Save.



Bersambung ke part 2...