Showing posts with label soap. Show all posts
Showing posts with label soap. 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, June 14, 2016

Register WSDL SOAP API via Policy Studio di OAG

Setelah sebelumnya kita sudah berhasil membuat filter "IP Address" dan "Throttling" menggunakan policy healthcheck, sekarang kita akan coba mendaftarkan SOAP web service ke OAG dengan menggunakan policy studio.

Untuk lebih jelasnya simak dan ikuti langkah-langkah berikut:
  1. Buka console policy studio, secara default akan seperti gambar di bawah
  2. Persiapkan wsdl yang akan kita daftarkan ke dalam OAG. Kita bisa menggunakan global weather wsdl atau bisa menggunakan wsdl yang kita pernah miliki sendiri. Untuk global weather dapat dilihat di url berikut http://www.webservicex.com/globalweather.asmx?wsdl
  3. Kembali ke policy studio, plih Business Services --> Web Service Repository --> Web Services --> Register Web Service
  4. Akan muncul halaman Load WSDL, kemudian inputkan WSDL URL sesuai dengan url yang ada di langkah no 2, kemudian pilih Next
  5. Klik button Select All untuk memilih semua WSDL operations
  6. Klik Next pada langkah WS-Policy Options
  7. Pada langkah Deploy Policy, kita akan menentukan policy wsdl global weather akan di deploy ke path yang mana, pilih Default Services agar wsdl tersebut nanti diakses dari port 8080 
  8. Akan muncul halaman summary dari hasil deploy wsdl yang sudah kita lakukan sebelumnya
  9. Setelah proses deploy berhasil maka secara otomatis OAG akan men-generate beberapa komponen seperti berikut:
    • path policy location yang ada di Listener --> Oracle API Gateway --> Default Services --> path
    • Global weather Web Services yang ada di Business Service --> Web Service Repository --> Web Services --> GlobalWeather
    • Global weather policy yang ada di Policies --> Generated Policies --> Web Services.GlobalWeather --> /globalweather.asmx
  10. Langkah terakhir adalah deploy dengan cara klik F6 atau klik tombol pojok kanan atas
  11. Test untuk melihat hasil nya dengan cara http://ip:port/globalweather.asmx?wsdl
Akhirnya kita telah berhasil untuk mendaftarkan wsdl SOAP ke OAG, wsdl global weather juga sudah dapat diakses melalui OAG. Kita dapat menambahkan beberapa filter untuk memproteksi service tersebut sesui dengan kebutuhan. Contoh proteksi service sudah pernah kita bahas sebelumnya di link blog berikut http://blog.nostratech.com/2016/06/membuat-filter-ip-address-dan.html

Semoga informasi ini dapat bermanfaat :)

Terimakasih.

Referensi : https://www.youtube.com/watch?v=-lRIB9iV_ac

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 !!