Kemahiran HTTP yang membezakan pembangun CFML
Kemahiran HTTP yang jarang diuji dalam temuduga tetapi menentukan kualiti kerja: ETag dan 304, Cache-Control, kod status betul, dan bukti pada enjin sebenar.

Kandungan
- Kemahiran HTTP yang membezakan pembangun CFML
- Mengapa HTTP menentukan nilai anda
- Kemahiran 1: ETag dan 304
- Kemahiran 2: Cache-Control, bukan sekadar max-age
- Kemahiran 3: kod status yang betul
- Kemahiran 4: mengesahkan andaian dengan alat, bukan dengan perasaan
- Kemahiran 5: had kadar dan kod 429
- Kemahiran 6: membaca dokumentasi, bukan meneka
- Apa yang perlu ditunjukkan semasa temuduga
- Cara menyemak kerja sendiri dalam lima minit
- Soalan lazim
- Perlukah ETag untuk semua respons?
- Adakah cfheader perlu sebelum cfcontent?
- Bagaimana menguji 304 di pelayar?
- Adakah kemahiran ini khusus CFML?
- Penutup
Kemahiran HTTP yang membezakan pembangun CFML
Kebanyakan pembangun CFML boleh menulis <cfquery>, membina borang dan menyiapkan CRUD. Bahagian itu tidak lagi membezakan sesiapa.
Yang membezakan ialah sama ada anda faham apa yang berlaku antara pelayar dan pelayan: pengepala, kod status, cache, dan sebab satu respons dihantar semula walaupun kandungannya tidak berubah.
Artikel ini bukan cerita kejayaan. Ia senarai kemahiran yang boleh diuji, dan setiap contoh di bawah dijalankan pada Lucee 7.1.1.17.
Mengapa HTTP menentukan nilai anda
Pekerjaan CFML di Malaysia banyak berkaitan sistem yang sudah berjalan: portal, sistem inventori, sistem e-dagang kecil, integrasi pembayaran. Dalam sistem begitu, masalah yang paling kerap muncul bukan sintaks CFML, tetapi salah faham tentang protokol.
Antaranya: mengapa pelayar masih memuat semula halaman yang tidak berubah, mengapa API memulangkan 200 apabila sepatutnya 404, dan mengapa cache CDN menyimpan data peribadi pengguna.
Ketiga-tiganya masalah HTTP, bukan masalah bahasa.
Kemahiran 1: ETag dan 304
ETag ialah cap jari kandungan. Apabila pelayar meminta semula, ia menghantar cap jari yang disimpannya. Jika kandungan belum berubah, pelayan menjawab 304 Not Modified tanpa badan respons, dan pelayar guna salinan tempatan.
kandungan = '{"status":"ok","versi":3}';
etag = '"' & lcase(hash(kandungan, "MD5")) & '"';
cfheader(name="ETag", value=etag);
cfheader(name="Cache-Control", value="public, max-age=60, must-revalidate");
if ((cgi.http_if_none_match ?: "") == etag) {
cfheader(statuscode=304, statustext="Not Modified");
cfabort;
}
cfcontent(type="application/json", reset="true");
writeOutput(kandungan);
Tiga keputusan dalam 11 baris itu penting:
- ETag dikira daripada kandungan, bukan daripada masa. Cap jari berasaskan masa akan berubah setiap permintaan dan menjadikan cache tidak berguna
- ETag mesti bermula dan berakhir dengan tanda petik, kerana itulah format dalam spesifikasi HTTP
- Perbandingan dibuat dengan nilai yang sudah wujud, bukan dengan pemboleh ubah yang mungkin tiada
Hasil sebenar pada rig, dengan curl:
tanpa header If-None-Match : 200
dengan ETag yang sama : 304
dengan ETag yang salah : 200
Satu perangkap yang saya temui semasa menulis ini: cfheader(name="Status", value="304 Not Modified") tidak menghasilkan 304 dalam Lucee 7.1.1.17. Ia pulang 200. Yang berfungsi ialah cfheader(statuscode=304, statustext="Not Modified").
Ini bukan perkara kecil dalam temuduga teknikal. Calon yang tahu bezanya pernah benar-benar menguji kodnya.
Kemahiran 2: Cache-Control, bukan sekadar max-age
max-age sahaja tidak mencukupi. Dua arahan yang paling kerap disalahgunakan:
publicbermaksud mana-mana cache, termasuk CDN, boleh menyimpannya. Jangan sekali-kali pada respons yang mengandungi data penggunamust-revalidatebermaksud cache mesti bertanya semula selepas tempoh tamat, bukan terus menggunakan salinan lama
Untuk data peribadi, gunakan private dan no-store jika ia sensitif. Untuk aset statik yang ada versi dalam URL, public, max-age=31536000, immutable adalah betul kerana URL berubah apabila fail berubah.
Peraturan mudah: jika respons berbeza mengikut pengguna, ia tidak boleh public.
Kemahiran 3: kod status yang betul
Satu tabiat yang membezakan pembangun biasa daripada yang dipercayai: memulangkan kod status yang tepat, bukan 200 untuk semuanya.
kod = { "200": 200, "401": 401, "403": 403, "404": 404, "422": 422, "405": 405 };
cfheader(statuscode=kod[c] ?: 500);
cfcontent(type="application/json", reset="true");
writeOutput('{"kod":' & (kod[c] ?: 500) & '}');
Diuji dengan curl, setiap kod keluar seperti yang diminta:
c=200 -> 200 c=401 -> 401 c=403 -> 403
c=404 -> 404 c=422 -> 422 c=405 -> 405
c=999 -> 500
Nilai 999 tidak sah, dan kod itu pulang 500, iaitu tingkah laku yang betul: input tidak sah tidak boleh menghasilkan kod status tidak sah.
Beza yang sering keliru:
- 401 bermaksud belum disahkan. Pelanggan patut log masuk
- 403 bermaksud disahkan tetapi tidak dibenarkan. Log masuk semula tidak membantu
- 404 bermaksud sumber tidak wujud. Jangan guna 403 untuk menyembunyikan kewujudan jika 404 yang anda maksudkan
- 422 bermaksud permintaan sah dari segi sintaks tetapi gagal pengesahan
- 405 bermaksud kaedah HTTP tidak dibenarkan pada laluan itu
Kemahiran 4: mengesahkan andaian dengan alat, bukan dengan perasaan
Pembangun yang baik tidak mengandaikan. Ia menguji dengan curl, membaca pengepala, dan membandingkan hasil.
Tabiat yang berbaloi dibina:
- Semak pengepala respons, bukan hanya kod status:
curl -sI - Uji kes gagal, bukan hanya kes berjaya
- Rekod hasil sebenar dalam commit atau nota, supaya orang lain boleh mengulanginya
Ini juga kemahiran yang membuat kod anda mudah disemak. Penyemak kod tidak perlu meneka sama ada anda sudah menguji 304, kerana anda menulis hasilnya.
Kemahiran 5: had kadar dan kod 429
Apabila pelayan melindungi dirinya, ia memulangkan 429 Too Many Requests, selalunya bersama pengepala Retry-After yang memberitahu berapa saat untuk menunggu.
Ini kemahiran yang jarang disebut dalam temuduga, tetapi ia muncul serta-merta apabila sistem anda diserang atau apabila satu penyepaduan menghantar permintaan terlalu kerap.
Contoh sebenar daripada pelayan yang saya uruskan: had 60 permintaan seminit dengan burst 30 menghasilkan 34 permintaan diterima dan 36 ditolak apabila diuji dengan 70 permintaan pantas. Nombor itu bukan teori; ia hasil ukuran, dan ia memberitahu saya sama ada had itu terlalu ketat untuk pelawat sebenar.
Yang perlu anda tahu:
429berbeza daripada403.403bermaksud tidak dibenarkan sama sekali;429bermaksud cuba lagi kemudianRetry-Afterboleh berbentuk saat atau tarikh. Pelanggan yang baik membacanya, bukan meneka- Had kadar mesti diukur dengan trafik sebenar sebelum diaktifkan, bukan dipilih secara rawak
Jika anda membina API, uji had anda sendiri dan rekod hasilnya. Itu bukti kemahiran, bukan sekadar pengakuan.
Kemahiran 6: membaca dokumentasi, bukan meneka
Lucee mempunyai tingkah laku yang berbeza daripada Adobe ColdFusion dalam beberapa tempat. Contohnya, cfheader dengan atribut name="Status" tidak berkesan seperti yang dijangka, dan serializeJSON() menukar kunci struct kepada huruf besar.
Pembangun yang membaca dokumentasi dan menguji pada enjin yang betul akan menjimatkan berjam-jam. Pembangun yang meneka akan menghantar kod yang berfungsi pada mesinnya sahaja.
Apa yang perlu ditunjukkan semasa temuduga
Jika ditanya tentang kemahiran HTTP, jawab dengan bukti, bukan dengan pengakuan. Contoh jawapan yang kuat:
- "Saya guna ETag berasaskan hash kandungan, dan saya uji tiga kes: tanpa header, tag sama, tag salah. Hasilnya 200, 304, 200."
- "Saya bezakan 401 dan 403 kerana pelanggan saya perlu tahu sama ada log masuk semula membantu."
- "Untuk aset statik saya guna
immutablebersama versi dalam URL, bukanno-cache."
Setiap jawapan itu boleh disemak. Itulah maksudnya.
Cara menyemak kerja sendiri dalam lima minit
Sebelum menghantar kerja, jalankan tiga semakan ini. Kesemuanya menggunakan alat yang sudah ada pada mana-mana pelayan Linux.
curl -sI https://laman.anda/laluan # pengepala: ETag, Cache-Control, status
curl -s -o /dev/null -w '%{http_code}\n' ... # kod status sahaja
curl -s -H 'If-None-Match: "..."' ... # adakah 304 benar-benar berlaku
Jika ketiga-tiganya memberi hasil yang anda jangka, anda sudah menguji lebih banyak daripada kebanyakan calon. Jika tidak, anda baru menemui pepijat sebelum pelanggan menemukannya.
Soalan lazim
Perlukah ETag untuk semua respons?
Tidak. Ia berbaloi untuk respons yang diminta berulang kali dan jarang berubah, seperti senarai kategori atau konfigurasi. Untuk respons yang berubah setiap permintaan, ETag hanya menambah overhead.
Adakah cfheader perlu sebelum cfcontent?
Pada Lucee 7.1.1.17, kedua-dua susunan berfungsi. Saya uji dengan satu pengepala sebelum cfcontent(reset="true") dan satu selepasnya, dan kedua-duanya muncul dalam respons. Tetapkan pengepala dahulu sebagai kebiasaan, kerana enjin lain dan middleware boleh mengubah tingkah laku ini.
Bagaimana menguji 304 di pelayar?
Pelayar menyembunyikannya. Guna curl dengan -H "If-None-Match: ...", atau tab Network dalam alat pembangun, di mana kod status dipaparkan.
Adakah kemahiran ini khusus CFML?
Tidak. Ia berlaku pada mana-mana bahasa. Tetapi dalam CFML, ia jarang diajar, dan itulah sebabnya ia membezakan.
Penutup
Kemahiran HTTP bukan kemahiran sampingan. Ia kemahiran asas yang menentukan sama ada sistem anda laju, selamat dan mudah diselenggara.
Kalau anda hanya ada masa untuk satu perkara minggu ini, pilih ETag dan kod status. Kedua-duanya memberi kesan serta-merta, dan kedua-duanya boleh ditunjukkan dengan satu arahan curl.
Untuk asas pangkalan data yang berkaitan, lihat pagination keyset. Untuk pengesahan input, lihat SQL injection dan cfqueryparam.