Cara Test API Endpoint: DNS, TLS, Header & CORS

Poin penting

"API-nya down" hampir tidak pernah berarti satu masalah saja. Uji dalam enam lapisan (DNS, port 443, TLS, status HTTP, CORS, payload) dan berhenti di lapisan pertama yang gagal. Penyebab yang umum adalah record DNS yang belum menyebar, sertifikat yang kedaluwarsa semalam, atau header Access-Control-Allow-Origin yang hilang sehingga panggilan dari browser gagal padahal curl berjalan normal.

Periksa sekarang

Diagram enam lapisan untuk menguji endpoint API publik: resolusi DNS, port 443, sertifikat TLS, header HTTP, CORS, dan payload JSON
Diagram enam lapisan untuk menguji endpoint API publik: resolusi DNS, port 443, sertifikat TLS, header HTTP, CORS, dan payload JSON
Mulai membaca
  1. Mengapa "API-nya Down" Tidak Pernah Satu Masalah
  2. Pilih Endpoint Asli yang Boleh Anda Uji Berkali-kali
  3. Lapisan 1: Apakah Nama Host Ter-resolve?
  4. Lapisan 2: Apakah Port 443 Terbuka?
  5. Lapisan 3: Apakah Sertifikat TLS Valid?
  6. Lapisan 4: Baca Header Respons
  7. Seperti Apa Respons JSON yang Sehat
  8. Lapisan 5: Header yang Hanya Merusak Panggilan dari Browser
  9. Jebakan Preflight: Jalan Sampai Anda Menambah Header
  10. Lapisan 6: Apakah Payload Berbentuk Seperti yang Diharapkan?
  11. Gejala → Lapisan → Alat
  12. Pertanyaan yang Sering Diajukan

Mengapa "API-nya Down" Tidak Pernah Satu Masalah

Saat panggilan API gagal, error yang ditampilkan klien biasanya dibuat beberapa lapisan di atas bagian yang benar-benar rusak. Browser yang melaporkan Failed to fetch tidak bisa memberi tahu apakah nama host gagal di-resolve, koneksi TCP ditolak, handshake TLS ditolak, atau server mengembalikan 200 yang sehat tetapi dibuang browser karena header CORS tidak ada. Keempatnya menghasilkan pesan yang sama.

Solusinya adalah berhenti menebak dan menelusuri tumpukan secara berurutan. Setiap lapisan hanya bermakna jika lapisan di bawahnya berhasil, jadi lapisan pertama yang gagal adalah bug Anda yang sebenarnya — semua setelahnya hanya noise.

Ada enam lapisan yang layak diperiksa, dan semuanya memakan waktu sekitar dua menit:

  • DNS — apakah nama host ter-resolve menjadi alamat IP?
  • Port 443 — apakah ada yang listening, atau koneksi ditolak atau difilter?
  • TLS — apakah sertifikat valid, belum kedaluwarsa, dan disajikan dengan chain lengkap?
  • Status HTTP — apa yang sebenarnya dikembalikan server: 200, 401, 429, 503?
  • CORS — apakah respons membawa header yang dibutuhkan browser agar isinya diserahkan ke Anda?
  • Payload — apakah JSON-nya berbentuk seperti yang diharapkan kode Anda?

Cek status dan header endpoint sekarang

Pilih Endpoint Asli yang Boleh Anda Uji Berkali-kali

Untuk berlatih, Anda butuh endpoint aktif yang mengembalikan data asli, tidak memerlukan API key, dan tidak akan membatasi Anda saat permintaan yang sama dijalankan dua puluh kali. Itu menyingkirkan sebagian besar kandidat yang jelas — hampir semua API publik populer kini mewajibkan formulir pendaftaran dan token, sehingga permintaan yang gagal bisa saja disebabkan kredensial Anda, bukan lapisan yang sedang diuji.

Contoh di bawah memakai API jadwal salat gratis dari Waqt Azan (مواقيت الصلاة), layanan jadwal salat berbahasa Arab yang mencakup lebih dari 60.000 lokasi di lebih dari 100 negara. API ini cocok sebagai endpoint latihan karena tiga alasan: tanpa key dan tanpa header autentikasi, mengembalikan JSON terstruktur alih-alih HTML, dan menerapkan kebijakan CORS yang longgar — sehingga perintah curl berjalan persis seperti ditulis, dan contoh fetch() berjalan dari console halaman tanpa Content-Security-Policy yang ketat.

Endpoint ini menerima slug negara dan kota langsung di path:

bash
# Prayer times for a city — no API key, no headers required
curl -s https://waqtazan.com/api/v1/timings/saudi-arabia/riyadh

# The same data as a subscribable calendar feed
curl -s https://waqtazan.com/api/v1/ical/saudi-arabia/riyadh.ics

Ganti dengan host apa pun yang sedang Anda debug — keenam lapisan ini sama saja, baik Anda menguji API publik, server staging sendiri, maupun penerima webhook pihak ketiga.

Lapisan 1: Apakah Nama Host Ter-resolve?

DNS adalah penyebab yang sering. Sebuah record diubah dan belum menyebar, wildcard dihapus, atau API berada di subdomain yang belum pernah dibuat.

Resolve nama host sebelum yang lain. Jika langkah ini tidak mengembalikan apa pun, me-restart aplikasi sebanyak apa pun tidak akan membantu — klien Anda bahkan tidak sampai membuka socket.

bash
dig +short waqtazan.com A
nslookup waqtazan.com

# Compare what different resolvers see — catches mid-propagation records
dig +short waqtazan.com A @1.1.1.1
dig +short waqtazan.com A @8.8.8.8

Jika dua resolver publik berbeda hasil tak lama setelah Anda mengubah record, berarti masih menyebar, dan API akan tampak putus-putus tergantung resolver mana yang dipakai tiap klien (CDN dengan geo-routing bisa selalu memberi alamat berbeda ke tiap resolver, jadi bandingkan dengan record yang Anda set). Jalankan DNS lookup untuk melihat seluruh record, atau cek penyebaran di resolver global lewat pemeriksa propagasi DNS tepat setelah mengubah record.

Jawaban kosong di sini langsung berkaitan dengan ERR_NAME_NOT_RESOLVED di Chrome dan getaddrinfo ENOTFOUND di Node — ERR_NAME_NOT_RESOLVED memuat daftar perbaikan lengkapnya.

Satu hal yang tidak perlu dikhawatirkan: banyak API berada di belakang CDN, sehingga record A menunjuk ke edge CDN, bukan server asal. Itu normal. Yang penting Anda mendapat jawaban, bukan IP mana yang muncul.

Lapisan 2: Apakah Port 443 Terbuka?

Nama host ter-resolve, jadi ada sesuatu yang punya alamat. Sekarang cari tahu apakah ada yang listening di alamat itu. Di sinilah Anda membedakan tiga kegagalan yang sangat berbeda, yang oleh klien sering dilaporkan sama persis:

  • Terbuka (open) — handshake TCP selesai. Lanjut ke lapisan berikutnya.
  • Ditolak (refused) — host menjawab dengan RST seketika. Ada sesuatu di sana, tetapi tidak ada yang terikat ke port itu — biasanya layanan crash, atau hanya bind ke localhost.
  • Difilter (filtered) — koneksi menggantung sampai timeout. Firewall atau security group membuang paket secara diam-diam, itulah sebabnya permintaan Anda menggantung semenit lebih sebelum gagal (75 detik di macOS).
bash
# Time-boxed TCP check: -w limits the connect on Linux; on macOS use -G 5 instead
nc -vz -w 5 waqtazan.com 443

# Or with curl: --connect-timeout caps the connect; 000 means no response came back
curl -s -o /dev/null -w '%{http_code}\n' --connect-timeout 5 https://waqtazan.com/

Koneksi yang ditolak dan yang difilter butuh perbaikan yang sama sekali berbeda, jadi penting tahu mana yang Anda alami. Pemeriksa port membedakannya dan menguji dari luar jaringan Anda — ini penting, karena port yang terbuka dari VPN kantor bisa saja diblokir firewall dari internet publik.

Jika curl mencetak 000 sebagai kode status, tidak ada respons HTTP yang kembali. Biasanya permintaan gagal di lapisan 1–3 (tidak ada jawaban DNS, port ditolak atau difilter, handshake TLS gagal), tetapi server yang menerima koneksi lalu menutupnya atau tidak pernah menjawab juga menghasilkan 000; tambahkan -v untuk melihat langkah terakhir yang berhasil. ERR_CONNECTION_REFUSED membahas kasus ditolak secara rinci.

Lapisan 3: Apakah Sertifikat TLS Valid?

Port 443 terbuka, tetapi port terbuka tidak berarti endpoint HTTPS berfungsi. Sertifikat adalah penyebab klasik kerusakan semalam, karena kedaluwarsa sesuai jadwal dan otomatisasi perpanjangan gagal tanpa suara.

Sertifikat harus memenuhi tiga hal sekaligus: belum kedaluwarsa, namanya cocok dengan hostname yang diminta, dan server mengirim chain intermediate secara lengkap. Yang ketiga paling licik: chain yang tidak lengkap sering tetap jalan di browser, karena Chrome mengunduh sendiri intermediate yang hilang dan Firefox memuatnya sejak awal, sedangkan Node, Python, Java, dan curl build OpenSSL gagal (curl bawaan macOS memakai verifier Apple dan bisa saja lolos). Itulah asal laporan bug klasik "jalan di browser saya tapi tidak di production".

bash
# Expiry dates and subject
echo | openssl s_client -connect waqtazan.com:443 -servername waqtazan.com 2>/dev/null \
  | openssl x509 -noout -subject -dates

# Full chain as presented by the server
openssl s_client -connect waqtazan.com:443 -servername waqtazan.com -showcerts < /dev/null

Hitung jumlah sertifikat di output -showcerts. Satu sertifikat saja biasanya berarti intermediate hilang. Pemeriksa sertifikat SSL melaporkan masa berlaku, kelengkapan chain, dan kecocokan hostname sekaligus, dan apa itu SSL certificate chain menjelaskan mengapa intermediate sangat penting.

Pertahankan -servername: OpenSSL 1.1.1 ke atas mengisi SNI dari hostname di -connect, tetapi openssl LibreSSL bawaan macOS tidak, dan tidak ada versi yang melakukannya saat Anda terhubung ke alamat IP. Tanpa SNI, host bersama memberi sertifikat default-nya, atau seperti Cloudflare, memutus handshake, dan Anda mengejar ketidakcocokan nama yang sebenarnya tidak ada.

Lapisan 4: Baca Header Respons

TLS aman, jadi akhirnya Anda punya percakapan HTTP yang sebenarnya. Sekarang baca apa yang benar-benar dikatakan server, bukan apa yang diringkas klien Anda. Cetak header saja: body tetap diunduh lalu dibuang, jadi ini GET yang sama dengan yang dikirim klien Anda.

bash
curl -s -D - -o /dev/null https://waqtazan.com/api/v1/timings/egypt/cairo

Baca status line dulu, lalu content-type, baru yang lain. Kedua field itu memberi tahu apakah permintaan berhasil dan apakah body-nya JSON sebelum Anda membaca hal lain.

Seperti Apa Respons JSON yang Sehat

Menjalankan perintah di atas terhadap endpoint uji pada 27 Oktober 2026 mengembalikan header berikut, di antara lainnya:

HeaderNilaiArtinya
HTTP/2200Permintaan berhasil, dan server mendukung HTTP/2
content-typeapplication/jsonAnda akan menerima JSON, bukan halaman error HTML
content-length567Payload nyata, bukan body kosong
access-control-allow-origin*Browser diizinkan membaca respons ini
servercloudflareAda CDN di depan server asal
alt-svch3=":443"HTTP/3 diiklankan untuk permintaan berikutnya

Lapisan 5: Header yang Hanya Merusak Panggilan dari Browser

Di lapisan inilah berjam-jam hilang, karena di sinilah curl dan browser benar-benar berbeda. CORS diberlakukan oleh browser, bukan server. Jika Access-Control-Allow-Origin tidak ada, server tetap mengembalikan 200 yang lengkap dan benar — browser hanya menolak menyerahkan body ke JavaScript Anda.

Jadi gejalanya: curl berjalan sempurna, Postman berjalan sempurna, dan console browser mengatakan permintaan diblokir oleh kebijakan CORS. Tidak ada yang salah dengan server. Respons hanya kehilangan satu header.

Endpoint uji mengembalikan access-control-allow-origin: *, itulah sebabnya fetch() biasa dari origin mana pun berhasil:

javascript
// Run it in the console of a tab on a site without a strict CSP, such as example.com
// (this page's own CSP blocks it). It works there because ACAO is set to *
const r = await fetch('https://waqtazan.com/api/v1/timings/egypt/cairo')
console.log(await r.json())

Jebakan Preflight: Jalan Sampai Anda Menambah Header

Ada jebakan tingkat kedua, dan endpoint ini menunjukkannya dengan baik. Permintaan sederhana (GET biasa tanpa header kustom) berhasil. Tetapi begitu Anda menambahkan header kustom, atau POST dengan Content-Type: application/json, browser lebih dulu mengirim preflight OPTIONS, dan respons preflight harus membawa header CORS-nya sendiri (MDN).

Uji preflight secara terpisah, karena itu respons yang berbeda dari jalur kode yang berbeda:

bash
curl -s -D - -o /dev/null -X OPTIONS \
  -H 'Origin: https://example.com' \
  -H 'Access-Control-Request-Method: GET' \
  https://waqtazan.com/api/v1/timings/egypt/cairo

Per 27 Oktober 2026, preflight itu mengembalikan 200 dengan content-type: text/html dan sama sekali tanpa header access-control-allow-origin, sehingga permintaan ber-preflight dari browser akan diblokir, meskipun GET biasa berjalan baik.

Itulah jebakan persisnya: integrasi Anda berjalan di development, Anda menambahkan header Authorization atau X-Request-Id, dan integrasi rusak tanpa perubahan apa pun di sisi server. Jika Anda hanya butuh data publik, pertahankan permintaan tetap sederhana dan akan terus berjalan.

Lapisan 6: Apakah Payload Berbentuk Seperti yang Diharapkan?

Lapisan terakhir adalah yang benar-benar dipedulikan kode Anda. Respons 200 dengan JSON valid tetap bisa merusak jika sebuah field diganti nama, tipe berubah dari angka menjadi string, atau timestamp datang dalam format yang tidak Anda parse.

Lihat respons aslinya sebelum menulis parser. Endpoint ini mengembalikan waktu berformat tampilan sekaligus timestamp ISO, pola yang layak ditiru — string terlokalisasi untuk manusia, nilai ISO untuk kode:

json
{
  "city": { "slug": "riyadh", "name_ar": "الرياض", "name_en": "Riyadh" },
  "country": "saudi-arabia",
  "date": "2026-10-26",
  "times":    { "fajr": "4:38 ص", "dhuhr": "11:37 ص", "maghrib": "5:17 م" },
  "timesISO": { "fajr": "2026-10-26T01:38:00.000Z", "dhuhr": "2026-10-26T08:37:00.000Z" },
  "method": "umm_al_qura"
}

Selalu parse field yang bisa dibaca mesin. Di sini artinya timesISO, bukan times — string tampilan dilokalisasi dan akan berubah format begitu locale berubah.

Alirkan respons ke jq untuk memeriksa struktur dengan cepat: curl -s <url> | jq keys menampilkan field tingkat atas, dan jq '.times' masuk lebih dalam tanpa menggulir body mentah.

Gejala → Lapisan → Alat

Gunakan tabel ini untuk langsung menuju lapisan yang relevan, bukan menelusuri keenamnya setiap kali:

Yang Anda lihatLapisan yang gagalPeriksa dengan
ERR_NAME_NOT_RESOLVED, ENOTFOUND1 — DNSDNS lookup
ECONNREFUSED, gagal seketika2 — PortPemeriksa port
Permintaan menggantung, lalu timeout2 — Port difilterPemeriksa port
CERT_HAS_EXPIRED, UNABLE_TO_VERIFY_LEAF_SIGNATURE3 — TLSPemeriksa SSL
Jalan di browser, gagal di curl atau Node3 — Chain tidak lengkapPemeriksa SSL
401, 429, 5034 — Status HTTPPemeriksa HTTP Header
Jalan di curl, diblokir di browser5 — CORSPemeriksa HTTP Header
Unexpected token '<', "<!DOCTYPE "... is not valid JSON4 — Halaman error HTMLPemeriksa HTTP Header
Field hilang atau tipe salah6 — Payloadcurl … | jq

Latensi berada sedikit di luar tangga ini. Jika semua lapisan lolos tetapi respons lambat, ukur waktu bolak-balik ke host dengan ping dan periksa apakah resolusi nama itu sendiri yang menjadi penyebab dengan tes kecepatan DNS.

Cek header respons asli dari endpoint mana pun

Lihat kode status, content-type, dan header CORS persis seperti yang dikembalikan sebuah API. Permintaan dikirim dari sisi server, sehingga cache browser maupun ekstensi tidak bisa mengubah hasilnya. Gratis, tanpa daftar.

Sumber

  1. Cross-Origin Resource Sharing (CORS), MDN
  2. Fetch Standard: CORS-safelisted request headers, WHATWG

Pertanyaan yang Sering Diajukan

Bagaimana cara test API endpoint tanpa Postman?

curl mencakup semua yang dilakukan Postman untuk pengujian dasar. Gunakan curl -s -D - -o /dev/null <url> untuk melihat header respons saja, curl -s <url> | jq untuk memeriksa body JSON, dan curl -s -o /dev/null -w '%{http_code}' untuk mencetak kode status saja. Untuk pengecekan cepat tanpa terminal, pemeriksa HTTP header online mengembalikan informasi yang sama dari browser.

Mengapa API saya jalan di curl tetapi gagal di browser?

Hampir selalu CORS. Server mengembalikan respons valid dalam kedua kasus, tetapi browser menolak memberikan body ke JavaScript kecuali respons membawa header Access-Control-Allow-Origin yang mengizinkan origin Anda. curl mengabaikan CORS sepenuhnya, karena CORS adalah kebijakan keamanan browser, bukan server. Jika header hilang, server harus mengirimnya — tidak ada perbaikan di sisi klien.

Apa arti curl mengembalikan kode status 000?

Artinya tidak ada respons HTTP yang diterima, jadi tidak ada kode status untuk dilaporkan. Biasanya kegagalan terjadi sebelum HTTP: DNS tidak ter-resolve, koneksi TCP ditolak atau difilter, atau handshake TLS gagal. Server yang menerima koneksi lalu menutupnya atau tidak pernah membalas juga menghasilkan 000, jadi jalankan perintah lagi dengan -v untuk melihat langkah terakhir yang berhasil.

Bagaimana saya tahu API down untuk semua orang atau hanya untuk saya?

Uji dari luar jaringan Anda sendiri. Pemeriksa port dan DNS lookup yang berjalan di sisi server menyingkirkan resolver lokal, VPN, firewall kantor, dan cache browser dari persamaan. Jika endpoint menjawab pemeriksa eksternal tetapi tidak menjawab mesin Anda, masalahnya lokal — biasanya cache DNS atau aturan firewall.

Mengapa API mengembalikan 200 tetapi parser JSON saya error?

Hampir pasti Anda menerima HTML dengan status 200. Captive portal, proxy, dan beberapa halaman error mengembalikan kode sukses dengan body HTML. Periksa header content-type: jika isinya text/html, bukan application/json, body-nya adalah halaman web dan error parsing hanyalah gejala, bukan penyebab.

Apa itu CORS preflight dan kapan terjadi?

Preflight adalah permintaan OPTIONS otomatis yang dikirim browser sebelum permintaan sebenarnya setiap kali permintaan itu bukan 'sederhana': memakai metode selain GET, HEAD, atau POST, menyetel header kustom seperti Authorization, atau mengirim Content-Type selain data formulir atau teks biasa (application/json termasuk). Respons preflight itu sendiri harus menyertakan header CORS. Inilah sebabnya integrasi bisa berjalan baik sampai Anda menambahkan header autentikasi, lalu rusak tanpa perubahan di server.

Haruskah saya menguji DNS API dengan resolver sendiri atau yang publik?

Keduanya, lalu bandingkan. Resolver ISP Anda mungkin menyajikan record lama dari cache jauh setelah record otoritatif berubah. Menanyakan 1.1.1.1 dan 8.8.8.8 di samping resolver default Anda menunjukkan apakah Anda melihat keterlambatan propagasi atau record yang benar-benar hilang.

Apakah port 443 yang terbuka berarti endpoint HTTPS berfungsi?

Tidak. Port terbuka hanya memastikan ada sesuatu yang menerima koneksi TCP. Handshake TLS masih bisa gagal karena sertifikat kedaluwarsa, hostname tidak cocok, atau chain intermediate tidak lengkap. Periksa sertifikat secara terpisah setelah memastikan port terbuka.

Tentang penulis

Shaik Vahid

Pendiri DNS Robot. Vahid bertahun-tahun bekerja di dukungan web hosting, memperbaiki domain, record DNS, sertifikat SSL, dan pengiriman email untuk pelanggan. Ia membangun alat-alat DNS Robot dan menulis panduan ini dari error yang benar-benar dialami orang.

Cek HTTP Header

Analisis header respons HTTP dan penilaian header keamanan