Mengakses Web Services Menggunakan Method 'GET'

Pada latihan-latihan sebelumnya kita sudah mempelajari bagaimana men-download gambar dan plain-text dari suatu web. Seringkali kita juga perlu men-download file-file XML dan kemudian mem-parse isinya (salah satu contoh adalah dengan mengambil isi data web services). Jadi latihan ini kita akan mempelajari bagaimana terkoneksi dengan suatu web service dengan menggunakan method 'GET' HTTP. Setelah web services mengembalikan hasil dalam bentuk XML, kita mengekstrak bagian-bagian yang relevan dan menampilkannya dengan menggunakan class 'Toast'.

Dalam latihan ini, kita akan menggunakan method web dari: http://services.aonaware.com/DictService/DictService.asmx/Define?word=[parameter]

Karena itu untuk memperoleh definisi suatu kata, kita harus membuat koneksi HTTP terlebih dahulu ke method web tersebut dan kemudian mem-parse hasil XML yang dikembalikan, seperti latihan berikut di bawah ini:

1. Kita masih menggunakan project yang sama dalam latihan sebelumnya dan tambahkan kode seperti berikut dalam file 'MainActivity.java':
private String WordDefinition(String word) {
InputStream in = null;
String strDefinition = "";
try {
in = OpenHttpConnection("http://services.aonaware.com/DictService/DictService.asmx/Define?word=" + word);
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db;
try {
db = dbf.newDocumentBuilder();
doc = db.parse(in);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
doc.getDocumentElement().normalize();

/*mengambil semua elemen */
NodeList definitionElements = doc.getElementsByTagName("Definition");

/*iterasi masing-masing elemen */
for (int i = 0; i < definitionElements.getLength(); i++) {
Node itemNode = definitionElements.item(i);
if (itemNode.getNodeType() == Node.ELEMENT_NODE)
{
/*konversi node Definition menjado Elemen*/
Element definitionElement = (Element) itemNode;

/*mengambil semua elemen di dalam elemen */
NodeList wordDefinitonElements = (definitionElement).getElementsByTagName("WordDefinition");

strDefinition = "";
/*itereasi masing-masing elemen */
for (int j = 0; j < wordDefinitonElements.getLength(); j++) {
/*konversi node menjadi Element*/
Element wordDefinitionElement = (Element) wordDefinitonElements.item(j);

/*mengambil node-node anak di dalam elemen */
NodeList textNodes = ((Node) wordDefinitionElement).getChildNodes();

strDefinition += ((Node) textNodes.item(0)).getNodeValue() + ". \n";
}
}
}
} catch (IOException e1) {
Log.d("NetworkingActivity", e1.getLocalizedMessage());
}
/*mengembalikan definisi dari kata*/
return strDefinition;
}

private class AccessWebServiceTask extends AsyncTask {
protected String doInBackground(String... urls) {
return WordDefinition(urls[0]);
}
protected void onPostExecute(String result) {
Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show();
}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new AccessWebServiceTask().execute("android");
}
2. Jalankan di emulator Android Studio. Hasilnya akan seperti di bawah ini:
Tampilan isi teks yang diambil dari XML



Penjelasan:

Method 'WordDefinition()' pertamakali membuka koneksi HTTP ke web service, dengan melewatkan kata yang kita inginkan:
in = OpenHttpConnection("http://services.aonaware.com/DictService/DictService.asmx/Define?word=" + word);
Method itu kemudian menggunakan object 'DocumentBuilderFactory' dan object 'DocumentBuilder' untuk mendapatkan object 'Document' (DOM) dari suatu file XML (yaitu XML yang dihasilkan dari web service):
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db;
try {
db = dbf.newDocumentBuilder();
doc = db.parse(in);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
doc.getDocumentElement().normalize();

Setelah object 'Document' di-dapatkan, kemudian kita mendapatkan semua elemen dengan tag :
/*mengambil semua elemen */
NodeList definitionElements = doc.getElementsByTagName("Definition");
lihat gambar struktur xml di bawah ini.
Struktur XML yang diambil dari web services

Karena definisi suatu kata ada di dalam elemen , maka kita kemudian meng-ekstrak semua definisi tersebut:
/*iterasi masing-masing elemen */
for (int i = 0; i < definitionElements.getLength(); i++) {
Node itemNode = definitionElements.item(i);
if (itemNode.getNodeType() == Node.ELEMENT_NODE)
{
/*konversi node Definition menjado Elemen*/
Element definitionElement = (Element) itemNode;

/*mengambil semua elemen di dalam elemen */
NodeList wordDefinitonElements = (definitionElement).getElementsByTagName("WordDefinition");

strDefinition = "";
/*itereasi masing-masing elemen */
for (int j = 0; j < wordDefinitonElements.getLength(); j++) {
/*konversi node menjadi Element*/
Element wordDefinitionElement = (Element) wordDefinitonElements.item(j);

/*mengambil node-node anak di dalam elemen */
NodeList textNodes = ((Node) wordDefinitionElement).getChildNodes();

strDefinition += ((Node) textNodes.item(0)).getNodeValue() + ". \n";
}
}
}
Kode tersebut akan membuat perulangan semua elemen dan mencari elemen anak yang bernama . Isi teks dari elemen adalah definisi dari suatu kata dan definisi-definisi tersebut kemudian disatukan dalam dikembalikan dengan menggunakan method 'WordDefinition()':
/*mengembalikan definisi dari kata*/
return strDefinition;
Seperti biasa dalam latihan-latihan sebelumnya, kita perlu membuat subclass dari class 'AsyncTask' untuk memanggil method 'WordDefinition()' secara asynchronous:
private class AccessWebServiceTask extends AsyncTask {
protected String doInBackground(String... urls) {
return WordDefinition(urls[0]);
}
protected void onPostExecute(String result) {
Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show();
}
}
Dan terakhir, kita mengakses web service secara asynchronous dengan menggunakan method 'execute()' di dalam 'onCreate()':
new AccessWebServiceTask().execute("android");

No comments: