Skip to main content

Mengenal HTTP Methods GET, PUT, POST, dan PATCH dalam RESTful API dengan Jersey (JAX-RS): Pengertian dan Contoh Praktis

Jika sebelumnya kita mencoba mengenal apa itu JAX-RS (Java API for RESTful Web Services) pada artikel https://undebugable.blogspot.com/2024/10/memahami-jax-rs-di-jakarta-ee-dari-api.html, maka sekarang kita mencoba untuk Mengenal Metode HTTP GET, PUT, POST, dan PATCH dalam RESTful API dengan Jersey (JAX-RS) dalam pengertian dan contoh praktis.

"Cek base code pada repo https://github.com/yoesoff/HelloWorldServlet dengan branch jersey. dan baca article sebelumnya disini "

1. Pendahuluan

RESTful API adalah gaya arsitektur yang memanfaatkan protokol HTTP untuk berkomunikasi antara klien dan server. Pada dasarnya, setiap metode HTTP (GET, PUT, POST, PATCH, DELETE, dll.) memiliki peran yang berbeda dalam pengelolaan data. Dalam artikel ini, kita akan menjelaskan metode GET, PUT, POST, dan PATCH, serta cara mengimplementasikannya dalam layanan REST menggunakan Jersey (JAX-RS).


2. Penjelasan Singkat Setiap Metode HTTP

2.1. GET

  • Pengertian: Metode GET digunakan untuk meminta data dari server. Biasanya digunakan untuk mengambil data tanpa memodifikasi apapun di server.
  • Karakteristik:
    • Idempotent (tidak mengubah keadaan di server).
    • Digunakan untuk membaca data.

2.2. POST

  • Pengertian: POST digunakan untuk mengirim data ke server, umumnya untuk membuat sumber daya baru atau melakukan tindakan yang memodifikasi keadaan di server.
  • Karakteristik:
    • Tidak idempotent (setiap permintaan POST dapat menghasilkan hasil yang berbeda).
    • Digunakan untuk membuat sumber daya baru.

2.3. PUT

  • Pengertian: PUT digunakan untuk memperbarui data yang ada di server. Ini biasanya digunakan untuk memperbarui atau menggantikan seluruh sumber daya.
  • Karakteristik:
    • Idempotent (permintaan yang sama berulang kali akan menghasilkan efek yang sama).
    • Digunakan untuk menggantikan data yang ada.

2.4. PATCH

  • Pengertian: PATCH adalah variasi dari PUT yang digunakan untuk memperbarui sebagian sumber daya di server, bukan menggantikan seluruh data.
  • Karakteristik:
    • Tidak selalu idempotent (tergantung implementasinya).
    • Digunakan untuk memperbarui bagian tertentu dari sumber daya.



3. Contoh Implementasi di Jersey (JAX-RS)

Sekarang kita akan memberikan contoh implementasi dari masing-masing metode di JAX-RS menggunakan Jersey.

3.1. GET

  • Untuk mengambil data dari server, kita bisa membuat resource dengan metode GET.
@Path("/api/item")
public class ItemResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Item> getAllItems() {
        // Mengembalikan daftar item (misalnya dari database)
        return ItemService.getItems();
    }
}

3.2. POST

  • Untuk menambahkan data baru ke server, gunakan POST.
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response addItem(Item newItem) {
    // Menambahkan item baru (misalnya menyimpan ke database)
    ItemService.addItem(newItem);
    return Response.status(Response.Status.CREATED).entity(newItem).build();
}
Penjelasan: Metode ini menerima data JSON, menambahkannya ke server, dan mengembalikan status "CREATED" (201).

3.3. PUT

  • PUT digunakan untuk memperbarui data yang sudah ada.
@PUT
@Path("/{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response updateItem(@PathParam("id") int id, Item updatedItem) {
    // Memperbarui item berdasarkan ID
    Item existingItem = ItemService.getItemById(id);
    if (existingItem == null) {
        return Response.status(Response.Status.NOT_FOUND).build();
    }
    ItemService.updateItem(id, updatedItem);
    return Response.ok(updatedItem).build();
}
Penjelasan: Metode ini menerima data JSON yang berisi item yang di-update, dan menggantikan seluruh data item yang ada.

3.4. PATCH

  • PATCH digunakan untuk memperbarui sebagian dari sumber daya.
@PATCH
@Path("/{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response patchItem(@PathParam("id") int id, Map<String, Object> updates) {
    // Memperbarui sebagian data item
    Item existingItem = ItemService.getItemById(id);
    if (existingItem == null) {
        return Response.status(Response.Status.NOT_FOUND).build();
    }
    // Lakukan update sebagian
    ItemService.patchItem(id, updates);
    return Response.ok(existingItem).build();
}
Penjelasan: PATCH hanya mengupdate sebagian dari properti item yang ada berdasarkan input JSON yang diterima.

4. Contoh Penggunaan dan Pengujian dengan Postman atau Curl

4.1. GET Request

  • URL: http://localhost:8080/api/item
  • Method: GET
  • Response
[
  {"id": 1, "name": "Item1", "price": 100},
  {"id": 2, "name": "Item2", "price": 200}
]

4.2. POST Request

  • URL: http://localhost:8080/api/item
  • Method: POST
  • Body (JSON):
{
  "id": 3,
  "name": "Item3",
  "price": 300
}
  • Response
{
  "id": 3,
  "name": "Item3",
  "price": 300
}

4.3. PUT Request

  • URL: http://localhost:8080/api/item/2
  • Method: PUT
  • Body (JSON)
{
  "id": 2,
  "name": "Updated Item",
  "price": 500
}
  • Response
{
  "id": 2,
  "name": "Updated Item",
  "price": 500
}

4.4. PATCH Request

  • URL: http://localhost:8080/api/item/2
  • Method: PATCH
  • Body (JSON)
{
  "price": 550
}
  • Response
{
  "id": 2,
  "name": "Updated Item",
  "price": 550
}



Edit dan sesuikan pom.xml dengan menambahkan dependency berikut:

pom.xml

<dependency>

    <groupId>org.glassfish.jersey.media</groupId>

    <artifactId>jersey-media-json-jackson</artifactId>

    <version>3.1.0</version>

</dependency>

ProductAPIResource.java

package com.mhyusuf.api;

import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.*;

// Model sederhana untuk produk
class Product {
private int id;
private String name;
private double price;

// Constructors, getters, and setters
public Product() {}

public Product(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}
}

@Path("/products")
public class ProductAPIResource {

// Simpanan sementara produk dalam memori (seperti database sederhana)
private static Map<Integer, Product> productDB = new HashMap<>();
static {
productDB.put(1, new Product(1, "Laptop", 1000.0));
productDB.put(2, new Product(2, "Smartphone", 700.0));
}

// GET - Ambil semua produk
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getAllProducts() {
List<Product> products = new ArrayList<>(productDB.values());
return Response.ok(products).build();
}

// POST - Tambahkan produk baru
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response addProduct(Product newProduct) {
if (newProduct.getId() == 0 || newProduct.getName() == null || newProduct.getPrice() == 0.0) {
return Response.status(Response.Status.BAD_REQUEST).entity("Product ID, name, and price must be provided.").build();
}
productDB.put(newProduct.getId(), newProduct);
return Response.status(Response.Status.CREATED).entity(newProduct).build();
}

// PUT - Perbarui produk berdasarkan ID
@PUT
@Path("/{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response updateProduct(@PathParam("id") int id, Product updatedProduct) {
Product existingProduct = productDB.get(id);
if (existingProduct == null) {
return Response.status(Response.Status.NOT_FOUND).entity("Product not found.").build();
}
updatedProduct.setId(id); // Pastikan ID tetap sama
productDB.put(id, updatedProduct);
return Response.ok(updatedProduct).build();
}

// PATCH - Perbarui sebagian data produk
@PATCH
@Path("/{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response patchProduct(@PathParam("id") int id, Map<String, Object> updates) {
Product existingProduct = productDB.get(id);
if (existingProduct == null) {
return Response.status(Response.Status.NOT_FOUND).entity("Product not found.").build();
}

// Memperbarui hanya field yang disediakan di request
if (updates.containsKey("name")) {
existingProduct.setName((String) updates.get("name"));
}
if (updates.containsKey("price")) {
existingProduct.setPrice(Double.parseDouble(updates.get("price").toString()));
}

// Masukkan kembali produk yang diperbarui ke dalam database
productDB.put(id, existingProduct);
return Response.ok(existingProduct).build();
}
}

Contoh hasilnya di browser (Gunakan postman untuk POST, PUT dan PATCH)


 TODO: POST, PUT dan PATCH di POSTMAN

Informasi sample code di GITHUB

alamat git:  https://github.com/yoesoff/HelloWorldServlet.git 
lokasi branch: jersey-http-method

Informasi sample code di GITHUB

5. Kesimpulan 

Dalam RESTful API, setiap metode HTTP memiliki tujuan dan fungsi yang berbeda dalam mengelola sumber daya di server. GET untuk mengambil data, POST untuk menambah sumber daya baru, PUT untuk memperbarui seluruh data, dan PATCH untuk memperbarui sebagian data. Dengan Jersey (JAX-RS), kita dapat dengan mudah mengimplementasikan keempat metode ini untuk membangun layanan REST yang kuat dan terstandarisasi.


Dengan mengikuti panduan ini, pembaca akan memiliki pemahaman yang baik tentang penggunaan metode HTTP yang berbeda dalam RESTful API dan bagaimana mengimplementasikannya menggunakan Jersey.






Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Semalam kemarin (09 Januari 2019) tidak sengaja kami sekeluarga lewat Bandung Digital Hub saat pulang dari Fish Wow Cheeseee  yang di Jl. Lombok. Bandung Digital Hub ini sendiri berlokasi tidak jauh dari dari tempat kami makan tersebut, yaitu berlokasi di Jl. Laswi No.7, Kacapiring, Batununggal, Kota Bandung, Jawa Barat 40271. Berhubung untuk bulan Januari 2019 ini sedang tidak masuk ke kantor maka saya putuskan untuk besoknya (hari ini 09 Januari 2019) nyoba untuk bekerja remote dari Bandung Digital Hub , apalagi istri yang kebetulan follower pak Ridwan Kamil di Instagram juga Facebook dan tampaknya pernah lihat ulasan mengenai tempat ini sehingga tampak antusias supaya saya datang ketempat ini ini dan mencoba bekerja dari gedung creative hub dan coworking yang keren ini.  Tempat Parkir Masalah utama saat kita datang ke coworking space terutama yang berlokasi di Bandung (atau mungkin kota-kota lainnya) adalah lahan parkir, kadang lahan parkir ...

Numpang Kerja Remote dari Bandung Digital Valley

Satu lagi co-working place  gratisan dan keren yang cukup populer dikota Bandung, co-working place yang juga memberikan fasilitas tempat kerja (co-working place) dan fitur-fitur menarik lainnya,  co-working place keren  ini adalah Bandung Digital Valley atau yang sering disingkat BDV . C o-working place  Bandung Digital Valley ini  merupakan bagian dari Telkom , mulai aktif digunakan dari sekitar tahun 2012 lalu .  Tempat ini biasanya menjadi tempat favorit bagi para pengiat startup, freelancer, dan mahasiswa . Gedung BDV Gedung BDV Gedung BDV Co-working space Bandung Digital Valley ini sendiri berlokasi di Menara Bandung Digital Valley, Jl. Gegerkalong Hilir No.47, Sukarasa, Sukasari, Kota Bandung, Jawa Barat, detailnya bisa dilihat di Google map berikut. Pemandangan jalan setelah pintu satpam. Free Co-working Space Membership Untuk mulai menggunakan fasilitas co-working space ini secara gratis maka yang pe...

Membuat Authentikasi Berbasis Token pada Spring Boot dengan Spring Security dan JWT

Setelah beberapa kali mencari tutorial tentang otentikasi aplikasi web Spring Boot dengan menggunakan JWT yang mudah dipahami akhirnya saya menemukan artikel berbahasa Inggris tapi sangat mudah dipahami  dan diikuti, artikel tersbut berada disini , dengan judul " Spring Boot Token based Authentication with Spring Security & JWT ". Untuk memudahkan orang-orang yang terbiasa membaca artikel dalam bahasa indonesia (termasuk saya sendiri), artikel ini saya buat dan susun ulang (artikel aslinya tidak tertulis dengan runtut dan dapat membuat pemula bingung dengan berbagai error yang muncul) supaya lebih mudah untuk diikuti dan dapat di gunakan bersama. Applikasi yang akan kita buat adalah aplikasi web yang setiap endpoint-nya hanya bisa di akses oleh role tertentu. 1. Tools Yang Diperlukan IntelliJ Idea text editor. Spring Assistant Plugin. Postman. PostgreSQL + DBeaver. Min Java 8 Spring Boot 2.1.8 (dengan Spring Security, Spring Web, Spring Data JPA). jjwt 0.9.1. Maven 3.6.1....