Consume REST Menggunakan RestTemplate Spring Boot
Bismillah,
Pada kesempatan sebelumnya saya telah posting Web Service REST menggunakan Spring Boot, di tulisan ini saya akan coba gimana membuat REST client dan tentunya menggunakan Spring Boot. Walaupun sebenarnya bisa dicoba dengan mudah menggunakan tool yang sudah ada seperti browser, curl, ataupun yang lebih cantik menggunakan Postman. Tetapi tidak salahnya kita coba implementasikan Web Service REST client menggunakan Java. Beberapa point yang akan kita bahas adalah sebagai berikut
Konfigurasi Spring Boot
Hal pertama yang perlu kita lakukan ada mengkonfigurasi aplikasi yang akan kita buat, bisa menggunakan Spring Initializr di sini atau create project baru IntelliJ jenis projeknya Spring Initializr. Depedensi yang dibutuhakan adalah Spring Web Starter
dan Lombok
. Ya sederahan sekali depedensi yang dibutuhkan, Spring Web Starter
menyediakan class RestTemplate
sedangkan Lombok
yang menyediakan getter dan setter. Berikut ini adalah potongan file pom.xml
dari project yang akan kita buat
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
...
Selain file pom.xml
, konfigurasi yang dibutuhkan adalah menambahkan property pada file application.properties
di dalam folder resources
. Isi file tersebut adalah sebagai berikut
base.url=http://localhost:8081
Fungsi properties di atas sebenarnya hanya menyediakan alamat url dari Web Service yang akan kita akses, kita letakkan di file application.properties
agar kodingan kita lebih rapih dan juga ketika kita jadikan *.jar
aplikasi kita tidak ikut di dalamnya .
Membuat Entitas
Selanjutnya kita perlu membuat entitas untuk menampung atua mengirimkan objek ke Web Service yang akan kita akses, contoh entitas yang kita buat adalah entitas Mahasiswa
. Kodenya seperti di bawah ini
@Data
public class Mahasiswa {
private String nim;
private String nama;
private String jurusan;
private float ipk;
}
Cukup menambahkan @Data
kita sudah tidak perlu lagi membuat method getter dan setter, anotasi tersebut telah disediakan oleh depedensi Lombok
.
Membuat Class Bantu
Class bantu ini digunakan untuk menyediakan service-service entitas tertentu, misalkan yang sudah kita buat entitas Mahasiswa
berarti isi class bantu tersebut antara lain GetMahasiswa, insertMahasiswa, updateMahasiswa,
dll. Contoh kodenya adalah sebagai berikut
@Service
public class AkademikRestClient {
private final static Logger LOGGER = LoggerFactory.getLogger(AkademikRestClient.class.getName());
@Value(value = "${base.url}")
private String basUrl;
@Autowired
private RestTemplate restTemplate;
public String getMahasiswas() {
String response = restTemplate.getForObject(basUrl + "/api/mahasiswa", String.class);
LOGGER.info(response);
return response;
}
public Mahasiswa getMahasiswaByNim(String nim) {
Mahasiswa mahasiswa = restTemplate.getForObject(basUrl + "/api/mahasiswa/{nim}", Mahasiswa.class, nim);
LOGGER.info(mahasiswa.toString());
return mahasiswa;
}
public String getMahasiswaNama(String nama) {
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(basUrl + "/api/mahasiswaNama")
.queryParam("nama", nama);
LOGGER.info(builder.toUriString());
String response = restTemplate.getForObject(builder.toUriString(), String.class);
LOGGER.info(response);
return response;
}
public boolean insert(Mahasiswa mahasiswa) {
HttpEntity<Mahasiswa> mahasiswaHttpEntity = new HttpEntity<>(mahasiswa);
ResponseEntity<String> response = restTemplate.exchange(basUrl + "/api/mahasiswa", HttpMethod.POST, mahasiswaHttpEntity, String.class);
LOGGER.info("" + response.getStatusCode().value());
return (HttpStatus.CREATED.value() == response.getStatusCodeValue());
}
}
Penjelasan kode di atas adalah sebagai berikut
@Service
, untuk menandai bahwa class tersebut akan di-Autowire
di lain class. Sebenarnya@Service
bisa diganti dengan@Component
atau@Repository
@Value(value = "${base.url}")
, digunakan untuk mengambil nilai yang terdapat pada file application.properties dengan propertibase.url
@Autowired
, anotasi tersebut pada instancerestTemplate
menandakan bahwa instance tersebut di-inisialisasi dari Spring. Class RestTemplate menyediakan fungsi untuk mengakses REST dengan methodGET, POST, PUT, dan DELETE.
Terdapat beberapa class dan method yang penting di atas, class dan method tersebut adalah sebagai berikut
getForObject()
, digunakan untuk mengambil data dengan method yang disediakan adalahGET
. Ketika dari sisi server hanya mengembalikan HttpStatus sebaiknya tidak menggunakan ini, digunakan ketika server mengembalikan data.exchange()
, method ini dapat digunakan untuk semua method http, kita dapat mengambil HttpStatus jika dari server hanya mengembalikan HttpStatus.- Class
UriComponentsBuilder
, class yang dapat digunakan untuk membantu request dengan parameter. Misalkan jika method yang kita panggil menggunakanRequestParameter
. Contoh penggunaannya dicontohkan seperti berikut ini
public String getMahasiswaNama(String nama) {
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(basUrl + "/api/mahasiswaNama")
.queryParam("nama", nama);
LOGGER.info(builder.toUriString());
String response = restTemplate.getForObject(builder.toUriString(), String.class);
LOGGER.info(response);
return response;
}
Method di atas contoh penggunaan menggunakan parameter, url yang dipanggil seperti ini http://localhost:8081/api/mahasiswaNama?nama=[parameter]
. Misalkan parameternya ada banyak, tambahkan .queryParam("nama_parameter","valuenya").
Ujicoba Aplikasi
Untuk melakukan ujicoba bisa menggunakan unit test, kira-kira kode yang dapat digunakan adalah sebagai berikut
@RunWith(SpringRunner.class)
@SpringBootTest
public class ClientApplicationTests {
@Autowired
private AkademikRestClient akademikRestClient;
@Ignore
@Test
public void getMahasiswasTest() {
String response = akademikRestClient.getMahasiswas();
assertTrue(response != null && !response.isEmpty());
}
@Ignore
@Test
public void getMahasiswasByNimTest() {
Mahasiswa response = akademikRestClient.getMahasiswaByNim("075410099");
assertTrue(response != null);
}
@Ignore
@Test
public void getMahasiswasByNamaTest() {
String response = akademikRestClient.getMahasiswaNama("noprianto");
assertTrue(response != null && !response.isEmpty());
}
@Test
public void insertMahasiswasTest() {
Mahasiswa mahasiswa = new Mahasiswa();
mahasiswa.setNim("075410105");
mahasiswa.setIpk(2.50F);
mahasiswa.setJurusan("Teknologi Informasi");
mahasiswa.setNama("Fullan Bin Fudail");
assertTrue(akademikRestClient.insert(mahasiswa));
}
}
Silakan jalankan unit test di atas, hilangkan anotasi @Ignore
agar setiap methode dilakukan testing. Bagimana mudah bukan? Untuk kode dari contoh di atas dapat didownload di sini.
Demikianlah tulisan saya penggunaan Spring Boot untuk mengkonsumsi Web Service REST, semoga bermanfaat dan menjadi pengetahuan baru bagi Anda yang sedang belajar Java atau Spring Boot. Kritik dan saran selalu diharapkan untuk meningkatkan kwalitas tulisan saya. 🙂