Uji REST API dengan curl

1. Ikhtisar

Tutorial ini memberikan gambaran singkat tentang pengujian REST API menggunakan curl.

curl adalah alat baris perintah untuk mentransfer data dan mendukung sekitar 22 protokol termasuk HTTP. Kombinasi ini menjadikannya alat ad-hoc yang sangat baik untuk menguji layanan REST kami.

2. Opsi Baris Perintah

curl mendukung lebih dari 200 opsi baris perintah . Dan kita dapat memiliki nol atau lebih dari mereka untuk menyertai URL dalam perintah.

Tetapi sebelum kita menggunakannya untuk tujuan kita, mari kita lihat dua hal yang akan membuat hidup kita lebih mudah.

2.1. Verbose

Saat kami menguji, ada baiknya untuk menyetel mode verbose pada:

curl -v //www.example.com/

Akibatnya, perintah akan memberikan informasi bermanfaat seperti alamat IP yang diselesaikan, port yang kami coba sambungkan, dan header.

2.2. Keluaran

Secara default, curl mengeluarkan isi respons ke keluaran standar. Secara opsional, kami dapat memberikan opsi keluaran untuk menyimpan ke file:

curl -o out.json //www.example.com/index.html

Ini sangat membantu ketika ukuran responsnya besar.

3. Metode HTTP Dengan Curl

Setiap permintaan HTTP berisi metode. Metode yang paling umum digunakan adalah GET, POST, PUT dan DELETE.

3.1. DAPATKAN

Ini adalah metode default saat melakukan panggilan HTTP dengan curl. Faktanya, contoh yang ditampilkan sebelumnya adalah panggilan GET biasa.

Saat menjalankan instance lokal layanan di port 8082, kami akan menggunakan sesuatu seperti perintah ini untuk melakukan panggilan GET:

curl -v //localhost:8082/spring-rest/foos/9

Dan karena kami mengaktifkan mode verbose, kami akan mendapatkan lebih banyak informasi bersama dengan isi respons:

* Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 8082 (#0) > GET /spring-rest/foos/9 HTTP/1.1 > Host: localhost:8082 > User-Agent: curl/7.60.0 > Accept: */* >< HTTP/1.1 200 < X-Application-Context: application:8082 < Content-Type: application/json;charset=UTF-8 < Transfer-Encoding: chunked < Date: Sun, 15 Jul 2018 11:55:26 GMT < { "id" : 9, "name" : "TuwJ" }* Connection #0 to host localhost left intact

3.2. POS

Kami menggunakan metode ini untuk mengirim data ke layanan penerima. Dan untuk itu, kami menggunakan opsi data.

Cara termudah untuk melakukannya adalah dengan menyematkan data dalam perintah:

curl -d 'id=9&name=baeldung' //localhost:8082/spring-rest/foos/new

atau, teruskan file yang berisi isi permintaan ke opsi data seperti ini:

curl -d @request.json -H "Content-Type: application/json" //localhost:8082/spring-rest/foos/new

Dengan menggunakan perintah di atas sebagaimana adanya, kita mungkin mengalami pesan kesalahan seperti berikut:

{ "timestamp" : "15-07-2018 05:57", "status" : 415, "error" : "Unsupported Media Type", "exception" : "org.springframework.web.HttpMediaTypeNotSupportedException", "message" : "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported", "path" : "/spring-rest/foos/new" }

Ini karena curl menambahkan header default berikut ke semua permintaan POST:

Content-Type: application/x-www-form-urlencoded

Ini juga yang digunakan browser dalam POST biasa. Dalam penggunaan kami, kami biasanya ingin menyesuaikan tajuk tergantung pada kebutuhan kami.

Misalnya, jika layanan kami mengharapkan tipe konten json, maka kami dapat menggunakan opsi -H untuk mengubah permintaan POST asli kami:

curl -d '{"id":9,"name":"baeldung"}' -H 'Content-Type: application/json' //localhost:8082/spring-rest/foos/new

Prompt perintah Windows tidak mendukung tanda kutip tunggal seperti shell mirip Unix.

Akibatnya, kita perlu mengganti tanda kutip tunggal dengan tanda kutip ganda; melarikan diri dari mereka jika diperlukan:

curl -d "{\"id\":9,\"name\":\"baeldung\"}" -H "Content-Type: application/json" //localhost:8082/spring-rest/foos/new

Selain itu, jika kita ingin mengirim data dalam jumlah yang lebih besar, biasanya ada baiknya menggunakan file data.

3.3. TARUH

Metode ini sangat mirip dengan POST. Tetapi kami menggunakannya ketika kami ingin mengirim versi baru dari sumber daya yang ada. Untuk melakukan ini, kami menggunakan opsi -X.

Tanpa menyebutkan jenis metode permintaan, curl default menggunakan GET. Oleh karena itu, kami secara eksplisit menyebutkan jenis metode dalam kasus PUT:

curl -d @request.json -H 'Content-Type: application/json' -X PUT //localhost:8082/spring-rest/foos/9

3.4. MENGHAPUS

Sekali lagi, kami menetapkan bahwa kami ingin menggunakan DELETE dengan menggunakan opsi -X:

curl -X DELETE //localhost:8082/spring-rest/foos/9

4. Header Kustom

Kita dapat mengganti header default atau menambahkan header kita sendiri.

Misalnya, untuk mengubah header Host, kami melakukan ini:

curl -H "Host: com.baeldung" //example.com/

Untuk mematikan header User-Agent, kami memasukkan nilai kosong:

curl -H "User-Agent:" //example.com/

Skenario paling umum saat pengujian adalah mengubah header Content-Type dan Accept. Kami hanya perlu mengawali setiap header dengan opsi -H:

curl -d @request.json -H "Content-Type: application/json" -H "Accept: application/json" //localhost:8082/spring-rest/foos/new

5. Otentikasi

Sebuah layanan yang membutuhkan otentikasi akan mengirimkan kembali kode respon HTTP 401 - tidak sah dan header WWW-Authenticate terkait.

Untuk otentikasi dasar, kami cukup menyematkan kombinasi nama pengguna dan kata sandi di dalam permintaan kami menggunakan opsi pengguna :

curl --user baeldung:secretPassword //example.com/

Namun, jika kami ingin menggunakan OAuth2 untuk otentikasi, pertama-tama kami harus mendapatkan access_token dari layanan otorisasi kami.

Respons layanan akan berisi access_token:

{ "access_token": "b1094abc0-54a4-3eab-7213-877142c33fh3", "token_type": "bearer", "refresh_token": "253begef-868c-5d48-92e8-448c2ec4bd91", "expires_in": 31234 }

Sekarang, kita dapat menggunakan token di header Otorisasi kita:

curl -H "Authorization: Bearer b1094abc0-54a4-3eab-7213-877142c33fh3" //example.com/

6. Kesimpulan

Kami melihat penggunaan fungsionalitas minimal curl untuk menguji layanan REST kami. Meskipun dapat melakukan lebih dari apa yang telah dibahas di sini, untuk tujuan kita, ini sudah cukup.

Jangan ragu untuk mengetik curl -h pada baris perintah untuk memeriksa semua opsi yang tersedia. Layanan REST yang digunakan untuk demonstrasi tersedia di sini di GitHub.