Kerjaya Pasukan Lucee MY

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.

Kemahiran HTTP yang membezakan pembangun CFML
0
Kandungan

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:

  • public bermaksud mana-mana cache, termasuk CDN, boleh menyimpannya. Jangan sekali-kali pada respons yang mengandungi data pengguna
  • must-revalidate bermaksud 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:

  • 429 berbeza daripada 403. 403 bermaksud tidak dibenarkan sama sekali; 429 bermaksud cuba lagi kemudian
  • Retry-After boleh 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 immutable bersama versi dalam URL, bukan no-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.

0 komen

0 komen

Log masuk untuk menjawab atau memberi komen.

Log masuk