İstek ve yanıt
http_request, form ve JSON gövdeleri, başlıklar, çerezler ve yalıtım.
$app.listen dinlemeye başladığında sayfa artık bir kez değil, her istekte yeniden çalışır:
istek
↓
dosya baştan yürütülür (AST cache'ten; dosya değiştiyse yeniden ayrıştırılır)
↓
$req = new http_request → o isteğin nesnesi
↓
belge kurulur
↓
SSR → minify → gzip → yanıtuse http_request
$req = new http_request
if $req.method == http_request.types.POST then
out($req.form_data.name)
end ifOkunabilenler#
| Çağrı | Döner |
|---|---|
$req.method | "GET" / "POST" / … |
$req.path | istek yolu |
$req.content_type | "application/json" gibi (parametreler ayıklanmış) |
$req.form_data | form alanları nesnesi |
$req.json | çözülmüş JSON gövdesi ya da null |
$req.data | gövde biçimine bakmadan POST verisi |
$req.query | sorgu parametreleri nesnesi |
$req.headers | başlıklar nesnesi (adlar küçük harf) |
$req.body | ham gövde |
$req.form("ad") | alan ya da null |
$req.get("q") | sorgu parametresi ya da null |
$req.header("accept") | başlık ya da null |
$req.is("POST") | büyük/küçük harf duyarsız karşılaştırma |
http_request.types tablosu: GET POST PUT DELETE PATCH HEAD OPTIONS.
Nesne mi yardımcı mı#
$req.form_data.name alan yoksa hata verir — yazım hatası sessizce geçmesin diye. İsteğe bağlı alanlar için $req.form("name") kullanın; yoksa null döner.
Gövde biçimleri#
Content-Type | Nereye düşer |
|---|---|
application/x-www-form-urlencoded | form_data ve data |
multipart/form-data | form_data ve data (metin alanları) |
application/json | json ve data |
; charset=utf-8 gibi parametreler yok sayılır. Bozuk JSON sayfayı çökertmez; json null olur.
JSON, dilin kendi değerlerine çevrilir: nesne → object, dizi → array, sayı → int/float, true/false → bool, null → null.
$j = $req.json
out($j.get("kullanici").get("ad"))
out($j.get("etiketler").get(0))Kaçışlama#
Form verisi ham HTML değildir; belgeye girerken kaçışlanır. name=<script> göndermek etiket açmaz.
Yalıtım#
Her istek kendi çalıştırmasında yaşar; bir isteğin değişkenleri diğerine sızmaz. Eş zamanlı istekler birbirini etkilemez. from_file ile dahil edilen sayfalar da o anki isteği görür.
new http_request istek bağlamı yokken boş bir GET isteği döndürür; böylece sayfa konsoldan da çalıştırılabilir.
Kabul edilen yöntemler dinamik modda GET HEAD POST PUT DELETE PATCH, statik modda yalnızca GET HEAD'dir.
Dosya yükleme#
<form method="POST" enctype="multipart/form-data">
<input type="file" name="belge">
</form>$file = $req.files("belge")
if $file != null then
$file.save(path.pwd + "/uploads/" + $file.uuid + "." + $file.extension)
end if| Alan / çağrı | Anlamı |
|---|---|
$file.name | gönderilen ad — yol kısmı temizlenmiştir |
$file.safe_name | diske yazmaya uygun ad |
$file.uuid | her yükleme için benzersiz tanımlayıcı |
$file.size | bayt |
$file.mime_type | tür — içerikten belirlenir |
$file.extension | uzantı (noktasız) |
$file.image | görüntüyse {type, width, height}, değilse null |
$file.content | ikili içerik |
$file.save($yol) | diske yazar; dizin yoksa oluşturur |
Diske yazarken gönderilen adı kullanmayın. uuid iki kullanıcının aynı adı göndermesinde dosyaların birbirini ezmesini de engeller. Orijinal ad $file.name olarak durur ve meta veri diye saklanabilir.
Tür istemcinin bildirdiği başlıktan değil içerikten okunur; bildirilen başlık kullanıcıdan gelir ve değiştirilebilir. Gönderilen ad güvenilmezdir (../../etc/passwd); yalnızca son parça alınır. Gövde sınırı 10 MB'dir.
Görüntü işleme#
$gorsel = fs.image($file.content)
$gorsel.resize({width: 800}).to_jpeg({quality: 80}).save($yol)Okunan ve yazılan biçimler: JPEG, PNG, GIF. to_webp(...) henüz yok.