Belajar WSDL di Android: mengonversi suhu

,

Oke, kelanjutan dari belajar soap alias WSDL (entah sebutan mana yang lebih tepat) di tulisan kemarin, mari kita lanjutkan ke tahapan berikutnya: mengonversi suhu dari aplikasi android. Kali ini tidak lagi menggunakan pak pos alias postman.

Sebelumnya disclaimer dulu. Pada tulisan kali ini, sebagian (besar) kode yang ditulis dicontek dari tutorial di sini. Jadi sebagian (besar) kode yang ditulis saya masih belum paham, yang penting jalan saja dulu aplikasinya :D.

Kembali ke laptop. Agar bisa mengakses WSDL dari Android dengan mudah, kita membutuhkan pustaka alias librari. Salah satu librari yang bisa dipakai (dan sampai saat ini satu-satunya yang ditemukan dari hasil googling) adalah ksoap2-Android. Untuk itu, sebelum melakukan tindakan ngoding, mari masukkan dulu librarinya di berkas build.gradle (Module: app).

Pertama-tama, kita tambahkan parameter (atau fungsi?) dengan nama repositories. Lalu diisi dengan alamat maven si ksoap2-android.

repositories {
    maven { url 'https://oss.sonatype.org/content/repositories/ksoap2-android-releases/' }
}

Setelah itu, tambahkan librarinya di bagian dependencies:

dependencies {
    ...
    compile 'com.google.code.ksoap2-android:ksoap2-android:3.6.2'
    ...
}

Jangan lupa untuk sinkronisasi berkasnya supaya si librari tersebut diunduh oleh Android Studio. Jika sukses, biasanya di tab Gradle Console akan ada tulisan BUILD SUCCESSFUL. Kalau ada galat alias error, silakan cari sendiri galatnya. Bisa jadi koneksi internetnya bermasalah, atau bisa juga ada saltik.

Jika librari kSoap2 sudah yakin terpasang, langkah selanjutnya adalah memanfaatkan librari itu untuk mengonsumsi data berbasis wsdl ini. Contohnya masih sama dengan tulisan sebelumnya, yakni konversi suhu dari web service w3school.

Dari tutorial ini, ada beberapa langkah untuk mendapatkan data dari WSDL. Yakni membuat dan konfigurasi envelope, buat request dan mengirimkan request itu ke situs berbasis wsdl, mendapatkan data dari request, dan menampilkan data keluarannya.

Tapi, sebelumnya kita siapkan dulu dua method untuk membuat envelope dan request. Di sini kita gunakan SOAP 1.1, makanya di envelopnya ditulis SoapEnvelope.VER11.

    private SoapSerializationEnvelope getSoapSerializationEnvelope(SoapObject request) {
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.implicitTypes = true;
        envelope.setAddAdornments(false);
        envelope.setOutputSoapObject(request);

        return envelope;
    }

Untuk request, kita buat method dengan keluaran HttpTransportSE. Methodnya seperti di bawah ini.

   private HttpTransportSE getHttpTransportSE() {
        HttpTransportSE ht = new HttpTransportSE(Proxy.NO_PROXY,MAIN_REQUEST_URL,60000);
        ht.debug = true;
        ht.setXmlVersionTag("<!--?xml version=\"1.0\" encoding= \"UTF-8\" ?-->");
        return ht;
    }

Di sini ada tiga variabel yang digunakan. Yang pertama mengenai proksi (kita tidak pakai proksi, makanya ditulis NO_PROXY), lalu alamat webservice yang akan diakses (yang berakhiran .asmx), dan batas timeout pemanggilan url dalam satuan milidetik. Untuk MAIN_REQUEST_URL nanti kita isikan alamat dari w3school:

String MAIN_REQUEST_URL = "https://www.w3schools.com/xml/tempconvert.asmx";

Oke, persiapan sudah selesai. Sekarang kita lakukan langkah-langkah yang sudah disebutkan di atas dalam sebuah method, misalkan namanya ubahSatuan. Kedua method di persiapan tadi akan dipanggil di method ini.

    private String ubahSatuan(String fValue, String methodName) throws IOException, XmlPullParserException, NetworkOnMainThreadException {

        // buat SOAPAction. methodName adalah method yang akan dipanggil, 
        // apakah konversi celsius ke fahrenheit atau sebaliknya
        String action = SOAP_ACTION + methodName;

        //buat objek yang akan dimasukkan ke dalam envelope
        SoapObject request = new SoapObject(NAMESPACE, methodName);
        
        // buat instance dari HttpTransportSE         
        HttpTransportSE ht = getHttpTransportSE();
        
        // input parameter yang dikirim, disesuaikan dengan methodName yang digunakan.
        if(methodName.equals(METHOD_C_TO_F)){
            request.addProperty("Celsius", fValue);
        } else {
            request.addProperty("Fahrenheit", fValue);
        }

        // buat amplopnya
        SoapSerializationEnvelope envelope = getSoapSerializationEnvelope(request);

        // kirimkan request
        ht.call(action, envelope);

        // ambil hasilnya
        SoapPrimitive resultString = (SoapPrimitive) envelope.getResponse();

        String data = resultString.toString();
        Log.d("SOAP", "DATA: " + data);

        return data;

    } 

Parameter SOAP_ACTION dll yang digunakan sebagai berikut:

    private final static String NAMESPACE = "https://www.w3schools.com/xml/";
    private final static String MAIN_REQUEST_URL = NAMESPACE + "tempconvert.asmx";
    private final static String METHOD_C_TO_F = "CelsiusToFahrenheit";
    private final static String METHOD_F_TO_C = "FahrenheitToCelsius";
    private final static String SOAP_ACTION = NAMESPACE; //SOAPAction ini belum ditambah parameter methodName

Oke, jika tidak ada masalah, kita tinggal panggil method ubahSatuan(value, methodName). Agar aplikasi tidak crash, method ini harus dipanggil di thread terpisah. Karena itu kita gunakan AsyncTask, karena sampai saat ini saya belum tahu apakah retrofit bisa digunakan atau tidak.

    private class TaskWsdl extends AsyncTask<String, Void, Void>{

        String data;
        String DEGREE  = "\u00b0";

        @Override
        protected Void doInBackground(String... strings) {
            String value = strings[0];
            String methodName = strings[1];
            try {
                data = ubahSatuan(value, methodName);
            } catch (IOException | XmlPullParserException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            if(null != data){
                txt.setText(String.format("%s%s", data, DEGREE));
            } else {
                txt.setText("uuuu error");
            }

        }
    }

Dari kelas AsyncTask ini bisa dilihat, hasil dari method ubahSatuan akan dimasukkan ke data. Lalu jika tidak null, data akan ditampilan di TextView. Untuk kode lengkapnya bisa dilihat di repo ini, siapa tahu ada yang senasib dengan saya :D.

Nah, ribet kan berurusan dengan data wsdl mah? Mending pakai Restful biasa kan? 😀


Ada komentar?

This site uses Akismet to reduce spam. Learn how your comment data is processed.