Ağ ve gizli değerler
fetch ile API çağırmak, API anahtarlarını Keychain'de tutmak, hataları ele almak.
fetch
Eklentilerde tarayıcıdakine benzer bir fetch vardır. Yalnız https:// adreslerine ve manifest.json'da network:<alan-adı> olarak istenen alan adlarına gider.
"permissions": ["network:api.open-meteo.com"]const url = new URL("https://api.open-meteo.com/v1/forecast");
url.searchParams.set("latitude", "41.01");
url.searchParams.set("longitude", "28.97");
url.searchParams.set("current", "temperature_2m");
const res = await fetch(url, { timeout: 10_000 });
if (!res.ok) throw new Error(`Open-Meteo: ${res.status}`);
const data = await res.json<{ current: { temperature_2m: number } }>();Kısayol: ctx.network.fetchJSON<T>(url, init) isteği atar ve .json() döndürür.
İstek gövdesi
await fetch("https://api.example.com/items", {
method: "POST",
headers: { authorization: `Bearer ${token}` },
body: { title: "Yeni" }, // nesne → JSON, content-type kendiliğinden
});
await fetch("https://api.example.com/login", {
method: "POST",
body: new URLSearchParams({ user: "ada" }), // form
});Metin olduğu gibi, URLSearchParams form olarak, diğer her değer JSON olarak gönderilir. Gövde en fazla 1 MB.
Hatalar
| Hata | Ne zaman |
|---|---|
PermissionError | Alan adı network: izinlerinde yok, http:// adres ya da izinsiz bir adrese yönlendirme |
NetworkError | Bağlantı yok, DNS hatası, reddedilen bağlantı, 5 MB'tan büyük yanıt, istek sınırı aşıldı |
TimeoutError | timeout (varsayılan 15 sn) aşıldı |
4xx/5xx yanıtlar hata fırlatmaz; res.ok ve res.status'a bak.
async update(ctx) {
try {
const data = await ctx.network.fetchJSON<Weather>(url);
ctx.storage.set("last", data); // son iyi yanıtı sakla
return view(data);
} catch (error) {
const last = ctx.storage.get<Weather>("last");
if (error instanceof NetworkError && last) return view(last, { stale: true });
throw error;
}
}Çevrimdışıyken boşuna istek atmamak için await AdanotchKit.system.isOnline() ve network.change olayını kullanabilirsin.
Gizli değerler
API anahtarlarını ve parolaları koda ya da storage'a yazma. manifest.json'da secret türünde bir ayar tanımla; kullanıcı Ayarlar'da girer, Adanotch macOS Keychain'de saklar.
"settings": [
{ "key": "token", "type": "secret", "label": "GitHub token" }
]async update() {
const token = await AdanotchKit.secrets.get("token");
if (!token) {
return { expanded: ui.text("Ayarlar'dan bir GitHub token gir.", { tone: "secondary" }) };
}
const res = await fetch("https://api.github.com/user", {
headers: { authorization: `Bearer ${token}`, accept: "application/vnd.github+json" },
});
// …
}secretayarlarıctx.settings'e gelmez vedefaultalamaz.secrets.getkullanıcı değeri girene kadarnulldöner. Kullanıcı değeri kaydettiğinde ya da sildiğindeupdateyeniden çalışır.- Gizli değerler eklentinin kimliğine bağlıdır; başka eklenti okuyamaz.
Gizli değeri console.log ile yazdırma: günlükler Ayarlar › Geliştirici'de ve adanotch dev çıktısında görünür.
Görseller
ui.image(src) da aynı izin listesine tabidir: avatar göstereceksen görselin alan adını da iste.
"permissions": ["network:api.github.com", "network:avatars.githubusercontent.com"]