Web API itu istilah baru untuk menyebut pendekatan baru dalam mencapai tujuan lama, yaitu pengeksekusian fungsi/prosedur secara jarak jauh (RPC remote procedure call), namun mengisi ruang dimana para pendahulunya kurang sesuai jika diadaptasikan dengan lingkungan baru. Para pendahulu (yang kemungkinan masih relevan di beberapa konteks) antara lain di 'negara' Adobe Flex ada fasilitas RemoteObject, di dunia W3C ada Web Service yang muncul menjelang akhir 1990an, sebelumnya dari Sun Microsystem kingdom ada Java RMI (Remote Method Invocation) tahun 1995, sebelumnya lagi dari Microsoft ada DCOM, sebelumnya lagi di tahun 1980 ada CORBA dari OMG, sebelumnya lagi dari IBM ada APPC (advanced program to program communication), yang sempet jadi mainstream sebelum era internet (TCP/IP) booming di 1990an juga ada EDI (electronic document interchange).


KONTRAK
Apa itu RESTful WEB API (web service lebih diasosiasikan dengan dunia Web Service SOAP)
Lalu apa itu RESTful WEB API? untuk mengetahuinya perlu dipahami dulu apa itu API, application programming interface itu bisa dianalogikan dengan kontrak, kontraknya berisi kesepakatan nama fungsi/prosedur & tipenya, nama parameter beserta urutan deklarasi & tipenya, tentunya beserta kontrak fungsional secara keseluruhan.
Fungsi/prosedur dapat dianalogikan dengan perintah-perintah pada command prompt, ketika mengakses perintah untuk memindah berkas seperti mov c:\catatan.txt d: di dalam jendela command prompt windows, maka akan ada pemberitahuan perintah tidak dikenali, karena didalam sistem, kata kerja yang dipakai untuk memindahkan file dikenali sebagai move.
Lalu mengenai kontrak urutan parameter, parameter pertama punya makna untuk menentukan alamat sumber direktori absolute file, parameter kedua punya makna untuk menentukan alamat tujuan direktori absolute file jika urutan terbalik maka akan ada peringatan file yang dimaksud tidak ada.
Lalu kontrak pemisah antara nama program & parameter menggunakan spasi, tipe data atau bisa disebut juga kontrak struktur data dari parameter, misalkan dalam perintah move berlaku aturan alamat hirarki, yaitu setiap direktori di pisah dengan karakter backslash '\' atau forwardslash '/', untuk nama direktori yang mengandung spasi, spasinya perlu didahului karakter backslash.
Serta terdapat kontrak struktur data dari pesan yang dikembaikan oleh fungsi/program tersebut, misal antar data dipisah dengan spasi atau backslash atau semicolon atau koma dll.

Begitu pula untuk aturan pembuatan fungsi dan pemanggilan fungsi berlaku juga kesepakatan / konvensi tersebut. Di dunia OOP ( Object Oriented Programming) terdapat konsep interface yang merupakan wujud konkrit formal dari mekanisme kontrak, jika sebuah kelas meng'implements sebuah interface, berarti kelas tersebut telah dijamin oleh compiler bahwa kelas tersebut mempunyai fungsi yang sesuai kontrak. Hal ini berbeda dengan RESTful Web API, pengecekan kontrak tidak bisa dilakukan ketika compile-time, hanya ketika run-time, jadi ketidak patuhan (adhere, comply) terhadap kontrak (biasa disebut syntax error) tidak terdeteksi sebelum API tersebut digunakan atau terakses.

Remote Code Execution/Remote Procedure Call
RPC merupakan abstraksi untuk melakukan pemanggilan fungsi/prosedur yang berada di perangkat yang berbeda. Rutinitas programmer untuk melakukan pemanggilan fungsi yang berada di perangkat lain menjadi lebih singkat, karena kosa kata yang perlu didiskusikan tidak terlalu detil. Tanpa adanya konsep abstraksi RPC, setiap kali programmer ingin mengakses fungsi/prosedur yang berada di perangkat lain, programmer harus melakukan konversi dari tiap komponen parameter ke dalam representasi byte, lalu mengirimkannya menggunakan bantuan socket, begitu juga dari sisi pembuat fungsi yang harus men'decode dari data bertipe byte, menjadi tipe-tipe data dan makna yang berarti di dalam fungsinya, hal ini sama saja membuat protokol sendiri. Socket sendiri merupakan abstraksi dari jenjang transport dan jenjang network, dan goes on...

Booming Internet

Teknologi EDI, OMG CORBA, Java RMI, Microsoft DCOM, IBM APPC, yang lahir sebelum meledaknya internet secara signifikan & perang browser di 1995, mulai mengalami masalah ketika melalui router-router di internet, kebanyakan admin jaringan dengan alasan kemudahan administrasi dan keamanan, memblokir port yang tidak populer atau tidak jelas kegunaannya didalam organisasi otonomnya. Hal itu menjadi kendala bagi teknologi-teknologi RPC yang menggunakan port yang tidak sepopuler seperti port yang digunakan Web Server yaitu port 80. Proses administrasi port yang tidak sepopuler milik HTTP server tersebut memerlukan pengaturan dibanyak router, untuk meminimalkan overhead koordinasi dengan para admin jaringan, maka lahirlah Web Service SOAP yang memanfaatkan protokol HTTP sebagai jalur komunikasinya.

Non-Idempotent HTTP Method
Namun, karena Web Service SOAP hanya mendayagunakan Method GET yang untuk semua operasi pembacaan data, perubahan data, penghapusan data, dan penambahan data, dikhawatirkan proxy untuk cache data, yang sudah banyak tersebar dibanyak penjuru dunia akan membuat data menjadi tidak konsisten, dan juga, WSDL (Web Service Definition Language) yang merupakan padanan konsep Interface Definition Language di dunia OMB CORBA dan RMI (Remote Method Invocation) di Kerajaan Sun Microsystem membuat pembuat fungsi dan pengguna fungsi harus belajar bahasa baru hanya sekedar untuk memanggil fungsi, meski ada tool untuk konversi WSDL ke dalam beragam bahasa pemrograman. Dikarenakan masalah tersebut diatas maka lahirlah RESTful Web API oleh Roy Fielding di disertasinya.

RESTful Web API
RESTful sendiri merupakan aturan informal untuk perancangan API yang mendayagunakan protokol HTTP, tidak seperti pembuatan API dengan teknologi sebelumnya yang bebas menggunakan kata kerja apa saja yang deskriptif sesuai aksi yang dilakukan oleh fungsi, aturan RESTful yang dikembangkan oleh Roy Fielding membatasi hanya menggunakan kata kerja yang telah disediakan oleh protokol HTTP, Roy menyarankan method GET digunakan untuk  pembacaan data, PATCH/PUT untuk mengubah data, POST untuk insert data, dan DELETE untuk delete data. Misalkan:
Untuk mendapatkan larik/array sebuah data kepakaran yang diformat dengan JSON, dapat menggunakan perintah:
GET /karyawan/69/kepakaran HTTP/1.1\r\n
Host: sihrd.ums.ac.id\r\n
Accept: application/json\r\n\r\n

Untuk menambah kepakaran seorang karyawan dengan perintah:
POST /karyawan/69/kepakaran HTTP/1.1\r\n
Host: sihrd.ums.ac.id\r\n
Content-Type: application/json\r\nContent-Length: 35\r\n\r\n
{"bidangIlmu":{"idEbidangIlmu":79}}

Untuk mengubah kepakaran seorang karyawan dengan perintah:
PUT /karyawan/69/kepakaran HTTP/1.1\r\n
Host: sihrd.ums.ac.id\r\n
Content-Type: application/json\r\nContent-Length: 60\r\n\r\n
{"idTrkepakaranDosen":11,"bidangIlmu":{"idEbidangIlmu":139}}

Contoh pengaksesan RESTful Web API dari bahasa JavaScript (dulunya livescript) dan Java

Script untuk API kepakaran
/* sample data JSON dari API kepakaran http://127.0.0.1/hrd/karyawan/69/kepakaran/ */
[
{
"idTrkepakaranDosen": 11,
"karId": {
"idMkaryawan": 69,
"namaDepan": "wakhid"
},
"bidangIlmu": {
"idEbidangIlmu": 1,
"namaBidang": "Bioteknologi"
}
},
{
"idTrkepakaranDosen": 15,
"karId": {
"idMkaryawan": 69,
"namaDepan": "wakhid"
},
"bidangIlmu": {
"idEbidangIlmu": 2,
"namaBidang": "Image Recognition"
}
},
{
"idTrkepakaranDosen": 23,
"karId": {
"idMkaryawan": 69,
"namaDepan": "wakhid"
},
"bidangIlmu": {
"idEbidangIlmu": 9,
"namaBidang": "Marketing"
}
}
]

$(document).ready(function() {
//memuat isi tabel utama
muatTabelUtama();

//memuat isi select karyawan
$.getJSON('/hrd/karyawan/', function(data) {
var karyawan = '';
$.each(data, function(kunci, nilai) {
karyawan += '<option value="' + nilai.idMkaryawan + '">' + nilai.namaDepan + '</option>';
});
$('#daftar-karyawan').append(karyawan);
$('#daftar-karyawan2').append(karyawan);
});

//memuat isi select bidang
$.getJSON('/hrd/bidangilmu/', function(data) {
var bidang = '';
$.each(data, function(kunci, nilai) {
bidang += '<option value="' + nilai.idEbidangIlmu + '">' + nilai.namaBidang + '</option>';
});
$('#daftar-bidang').append(bidang);
$('#daftar-bidang2').append(bidang);
});

//daftar uid kepakaran
$.getJSON('/hrd/kepakaran/', function(data) {
var uid = '';
$.each(data, function(kunci, nilai) {
uid += '<option value="' + nilai.idTrkepakaranDosen + '">' + nilai.idTrkepakaranDosen + '</option>';
});
$('#uid').append(uid);
});

$('#uid').change(function(e) {
$.getJSON('/hrd/kepakaran/' + $('#uid').val(), function(data) {
$("#nama").html(data.karId.namaDepan);
});
});

//mendaftarkan controller kepada tombol ber id tambah, untuk INSERT
$('#tambah').click(function(e) {
$.post('/hrd/kepakaran',
$('#tambahan').serialize(),
function(data) {
muatTabelUtama();
});
});

//mendaftarkan controller kepada tombol ber id rubah, fungsi untuk UPDATE data
$('#rubah').click(function(e) {
$.ajax({
type: 'PUT',
url: '/hrd/kepakaran/' + $('#uid').val(),
data: $('#perubahan').serialize(),
success: function(data) {
muatTabelUtama();
}
});
});
});

function muatTabelUtama() {
$.getJSON('/hrd/kepakaran/', function(data) {
var html = '';
html += '<table border="1">';
html += '<thead><tr><th>uid</th><th>Karyawan</th><th>Bidang Ilmu</th></tr></thead><tbody>';
$.each(data, function(kunci, nilai) {
html += '<tr><td>' + nilai.idTrkepakaranDosen + '</td><td>' + nilai.karId.namaDepan + '</td><td>' + nilai.bidangIlmu.namaBidang + '</td></tr>';
});
html += '</tbody></table>';
$('#tampilan').html(html);
});
}

Teks JSON dari Web API di http://127.0.0.1:8080/api/soal

[
{
"pertanyaan": "Google didirikan oleh siapa?",
"indeksJawabanBenar": 3,
"jawabans": [
{
"jawaban": "Bill Gates"
},
{
"jawaban": "Steve Jobs"
},
{
"jawaban": "Larry Books"
},
{
"jawaban": "Larry Pages"
}
]
},
{
"pertanyaan": "Siapa itu Eric Schimidt?",
"indeksJawabanBenar": 0,
"jawabans": [
{
"jawaban": "CEO Google"
},
{
"jawaban": "CEO Microsoft"
},
{
"jawaban": "CEO Apple"
},
{
"jawaban": "CEO Adobe"
}
]
}
 

Kode pengaksesan Web API di jQuery

$(document).ready(
function() {
$.getJSON('/api/soal/', function(balasan) {
var tulisan = '';
tulisan += '<table border="1">';
tulisan += '<thead><tr><th>Pertanyaan</th><th>Jawaban</th></tr></thead><tbody>';
$.each(balasan, function(kunci, satuanPertanyaan) {
tulisan += '<tr><td>' + satuanPertanyaan.pertanyaan + '</td><td>';
var larikJawaban = satuanPertanyaan.jawabans;
tulisan += '<input type="radio" nama="jawaban" value="0">' + larikJawaban[0].jawaban;
tulisan += '<input type="radio" nama="jawaban" value="1">' + larikJawaban[1].jawaban;
tulisan += '<input type="radio" nama="jawaban" value="2">' + larikJawaban[2].jawaban;
tulisan += '<input type="radio" nama="jawaban" value="3">' + larikJawaban[3].jawaban;
tulisan += '</td></tr>';
});
tulisan += '</tbody></table>';
$('#tampilan').html(tulisan);
});
});

Kode pengaksesan Web API di java Desktop maupun java Web, tanpa JAX-RS Jersey

import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import javax.json.JsonReader;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;


public class App {
public static void main(String[] args) {
HttpGet permintaan = new HttpGet("http://127.0.0.1:8080/api/soal/");
permintaan.setHeader("Accept", "application/json");
JsonReader rdr = Json.createReader(new DefaultHttpClient().execute(permintaan).getEntity().getContent());
JsonArray larik = rdr.readArray();
for (int i = 0; i < larik.size(); i++) {
JsonObject satuanPertanyaan = larik.getJsonObject(i);
String pertanyaan = satuanPertanyaan.getString("pertanyaan");
int indeksJawabanBenar = satuanPertanyaan.getInt("indeksJawabanBenar");
JsonArray larikJawaban = satuanPertanyaan.getJsonArray("jawabans");
String jawabanA = larikJawaban.getJsonObject(0).getString("jawaban");
String jawabanB = larikJawaban.getJsonObject(1).getString("jawaban");
String jawabanC = larikJawaban.getJsonObject(2).getString("jawaban");
String jawabanD = larikJawaban.getJsonObject(3).getString("jawaban");


System.out.println(pertanyaan + " " + indeksJawabanBenar + " " + jawabanA+ " " + jawabanB+ " " + jawabanC+ " " + jawabanD);
}
}
}
 

Kode pengaksesan Web API di java Android

import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import java.util.Scanner;
import org.json.JSONArray;
import org.json.JSONObject;


public class App extends Activity {
@Override public void onCreate(Bundle bundelan) {
super.onCreate(bundelan);
setContentView(R.layout.kosongan);


HttpGet permintaan =new HttpGet("http://10.0.2.2:8080/api/soal/");
permintaan.setHeader("Accept", "application/json");

Scanner baca = new Scanner(new DefaultHttpClient().execute(permintaan).getEntity().getContent());
JSONArray larik = new JSONArray(baca.useDelimiter("\\A").next());
for(int i = 0; i<larik.length; i++){
JSONObject satuanPertanyaan = larik.getJSONObject(i);
String pertanyaan = satuanPertanyaan.getString("pertanyaan");
int indeksJawabanBenar = satuanPertanyaan.getInt("indeksJawabanBenar");
JSONArray larikJawaban = satuanPertanyaan.getJSONArray("jawabans");
String jawabanA = larikJawaban.getJSONObject(0).getString("jawaban");
String jawabanB = larikJawaban.getJSONObject(1).getString("jawaban");
String jawabanC = larikJawaban.getJSONObject(2).getString("jawaban");
String jawabanD = larikJawaban.getJSONObject(3).getString("jawaban");
System.out.println(pertanyaan + " " + indeksJawabanBenar + " " + jawabanA+ " " + jawabanB+ " " + jawabanC+ " " + jawabanD);
}
}
}
dari: pemrograman Web API

Reactions:

You Might Also Like:

Berikan Komentar Sembunyikan Komentar

Hello, how may we help you? Just send us a message now to get assistance.

Facebook Messenger ×