# Geavanceerde data en netwerken [Programmeergidsen](LEESMIJ.md) · [Edities](edities.md) Creator Pro en het technische proefrecht ondersteunen SQLite, geselecteerde bestanden en mappen, uitgebreidere HTTPS-verzoeken, streaming, WebSockets en afzonderlijke ontwikkel-/test-/productieconfiguratie. Deze API's werken in de desktop-IDE, CLI en ondersteunde gegenereerde native applicaties. De openbare speeltuin kan ze niet uitvoeren; browser- en telefoonhosts hebben geen adapter voor geavanceerde applicaties. Learner behoudt [opgeslagen waarden](gegevens-bewaren.md), [begrensde HTTPS GET](../ingebouwde-functies/haalWebTekst.md) en basisformulieren via code. Een Pro-editor maakt zijn gewone Core-uitvoer niet afhankelijk van Pro. ## Declareren wat het programma nodig heeft Drie beslissingen blijven gescheiden: de IDE/CLI controleert Pro voor geavanceerd uitvoeren/bouwen, het project declareert zijn vereisten en de uitvoerende gebruiker verleent expliciet toegang. Een licentie geeft nooit automatisch toegang tot bestanden of netwerken. Gebruik in **Bestand → Webtoegang van project** het onderdeel **Data en integraties · Creator Pro**. Vereisten blijven bewerkbaar in Learner. De waarde `capabilities` in een draagbaar project kan zijn: ```json { "schemaVersion": 2, "httpsOrigins": ["https://api.example.com"], "advanced": { "sqlite": true, "files": ["input"], "directories": ["reports"], "httpMethods": ["GET", "POST"], "streaming": true, "webSockets": true, "configKeys": ["region"], "secretNames": ["api"] } } ``` Dit is één eigenschap van een projectmanifest, geen compleet project. Declareer alleen wat je gebruikt. Versie 1 blijft ondersteund. Slotnamen zijn draagbare namen, geen hostpaden; zet hier geen inloggegevens of licentievlaggen in. Vóór uitvoering staan toestemmingen uit. Kies bestanden, mappen, configuratie en toegestane origins expliciet. Elke schrijfbare locatie vereist een afzonderlijke keuze. **Uitvoeren zonder toegang** voert het programma uit, maar geweigerde bewerkingen geven `ok: false` terug. Stop, intrekken van toestemming en vervangen van het project sluiten actieve verbindingen en handles. ## Elk resultaat controleren Al deze API's geven een gewone Map terug: | Sleutel | Betekenis | |---|---| | `ok` | Of de bewerking is geslaagd | | `status` | HTTP-status, of nul voor andere bewerkingen | | `value` | JSON-compatibele waarde, of Geen | | `error` | Stabiele fouttekst; leeg bij succes | Controleer `ok` voordat je `value` gebruikt. Gebruikelijke fouten zijn `denied`, `unavailable`, `invalid`, `limit`, `cancelled` en `timeout`. Een niet-ondersteunde host meldt `unavailable`. Fouten geven geen geheimen, SQL-tekst of hostpaden prijs. De voorbeelden hieronder zijn bedoeld voor een desktopproject met passende declaraties en expliciete toestemming. Het zijn geen voorbeelden voor de openbare speeltuin. ## SQLite gebruiken Een project met een vaste app-identiteit krijgt een privédatabase. Broncode kiest nooit een databasepad. Gebruik parameters voor waarden en migraties voor schemawijzigingen: ```text # language: nl laat schema = migreerData(1, ["CREATE TABLE scores (name TEXT NOT NULL, points INTEGER NOT NULL)", "CREATE INDEX scores_points ON scores(points)"]) als schema["ok"]: laat bewaard = voerSQLUit("INSERT INTO scores(name, points) VALUES (?, ?)", ["Nova", 12]) als bewaard["ok"]: laat rijen = vraagSQL("SELECT name, points FROM scores ORDER BY points DESC LIMIT 10", []) als rijen["ok"]: zeg rijen["value"] anders: zeg rijen["error"] anders: zeg bewaard["error"] anders: zeg schema["error"] ``` [voerSQLUit](../ingebouwde-functies/voerSQLUit.md) geeft het aantal gewijzigde rijen terug; [vraagSQL](../ingebouwde-functies/vraagSQL.md) geeft een lijst van maps. Geef resultaatkolommen unieke namen. SQLite NULL wordt Geen; BLOB-waarden en gehele getallen buiten het exacte 53-bitsbereik zijn niet ondersteund. Gebruik [beginTransactie](../ingebouwde-functies/beginTransactie.md), [bevestigTransactie](../ingebouwde-functies/bevestigTransactie.md) en [herstelTransactie](../ingebouwde-functies/herstelTransactie.md). Een onafgemaakte transactie wordt teruggedraaid wanneer de host sluit. Migraties beginnen bij 1 en volgen elkaar op. Dezelfde toegepaste versie met identieke stappen slaagt zonder herhaling; gewijzigde stappen geven een fout. Stappen en controlesom worden samen vastgelegd. Een migratie kan niet binnen een open transactie draaien. Grenzen zijn onder meer 32 MiB databasepagina's, 16 KiB per SQL-opdracht, 128 parameters/kolommen, 1000 resultaatrijen, 1 MiB waarden/resultaten en 5 seconden per bewerking. Een migratie mag 64 stappen en 64 KiB totale SQL bevatten. Ruwe SQL-transactieopdrachten, PRAGMA, ATTACH, extensies, triggers, virtuele tabellen en interne `_pliro_`-tabellen zijn geweigerd. ## Geselecteerde bestanden lezen [leesBestandsTekst](../ingebouwde-functies/leesBestandsTekst.md) en [schrijfBestandsTekst](../ingebouwde-functies/schrijfBestandsTekst.md) ontvangen een gedeclareerd slot en een relatief pad. Voor een geselecteerd bestand moet dat pad leeg zijn: ```text # language: nl laat inhoud = leesBestandsTekst("input", "") als inhoud["ok"]: zeg inhoud["value"] anders: zeg inhoud["error"] ``` Gebruik bij een mapslot paden zoals `rapport.txt` of `rapporten/dag1.txt`. [toonMapBestanden](../ingebouwde-functies/toonMapBestanden.md) met een leeg pad toont de geselecteerde map. Paden kunnen niet buiten die map komen; absolute paden, schijfnamen en backslashes zijn geweigerd. Lezen en schrijven gebruikt UTF-8, maximaal 1 MiB. Lijsten bevatten maximaal 256 gesorteerde namen. Alleen lezen is standaard; schrijven vereist apart toestemming. Een schrijfbare map kan gewone bestanden binnen die map aanmaken. Schrijven vervangt en synchroniseert de inhoud; het is geen crash-atomische reservekopie. ## Een HTTPS-verzoek doen [httpVerzoek](../ingebouwde-functies/httpVerzoek.md) ondersteunt gedeclareerde GET, HEAD, POST, PUT, PATCH, DELETE en OPTIONS. Ook GET via deze functie is geavanceerd; Learner gebruikt `haalWebTekst` of `haalWebJSON`. ```text # language: nl laat antwoord = httpVerzoek("https://api.example.com/items", {"method": "POST", "body": "{\"name\":\"Nova\"}", "format": "json", "headers": {"Content-Type": "application/json"}, "authorizationSecret": "api"}) als antwoord["ok"]: zeg antwoord["value"] anders: zeg antwoord["status"], antwoord["error"] ``` Vervang de voorbeeld-origin door je eigen dienst, zowel in de code als in de projectinstellingen. Opties zijn `method`, tekst `body`, `format` (`text` of `json`), `headers` en `authorizationSecret`. Toegestane headers zijn X-* plus Accept, Content-Type, If-Match, If-None-Match en Idempotency-Key. Rechtstreekse Cookie/Authorization-headers zijn geweigerd; authenticatie gebruikt een door de host gekozen geheimnaam. Origins moeten gedeclareerd en expliciet toegestaan zijn. TLS-controles, openbare-adresvalidatie, frequentie-/gelijktijdigheidsgrenzen en annulering blijven gelden. Privé-, loopback-, link-local- en metadata-adressen zijn geweigerd. Verzoeken gebruiken geen omgevingsinloggegevens of proxy en volgen geen redirects. Niet-2xx-resultaten tonen de status, niet de antwoordtekst. Grenzen: 10 seconden per verzoek, 1 MiB voor berichttekst/tekstresultaten, 64 KiB voor JSON-resultaten en 16 KiB voor headers. ## Streaming en WebSockets [openHTTPStroom](../ingebouwde-functies/openHTTPStroom.md) opent een HTTPS-antwoord via alleen GET en geeft een ondoorzichtige handle terug. [leesHTTPStroom](../ingebouwde-functies/leesHTTPStroom.md) geeft `{"text": ..., "done": ...}` in `value` terug, één UTF-8-regel inclusief regeleinde. Sluit met [sluitHTTPStroom](../ingebouwde-functies/sluitHTTPStroom.md). Grenzen: 32 KiB per regel, 1 MiB totaal en twee minuten. [openWebSocket](../ingebouwde-functies/openWebSocket.md) accepteert alleen `wss://`; declareer en verleen de overeenkomstige `https://`-origin. [stuurWebSocket](../ingebouwde-functies/stuurWebSocket.md) en [ontvangWebSocket](../ingebouwde-functies/ontvangWebSocket.md) wisselen tekst uit. [sluitWebSocket](../ingebouwde-functies/sluitWebSocket.md) geeft de handle vrij. Authenticatie volgt dezelfde regels voor hostgeheimen. WebSockets staan 64 KiB per bericht, 256 berichten en 1 MiB totaalverkeer toe, met 10 seconden per bericht en twee minuten per verbinding. Compressie staat uit. Een host staat één open stroom/socket toe; gesloten handles zijn niet herbruikbaar. ## Configuratie en geheimen op de host kiezen De uitvoerende gebruiker kiest een afzonderlijk host-JSON-bestand buiten projectbroncode en media: ```json { "schemaVersion": 1, "environments": { "development": { "values": {"region": "eu"}, "secrets": { "api": { "value": "Bearer vervang-op-de-host", "origins": ["https://api.example.com"] } } }, "test": {"values": {"region": "test"}, "secrets": {}}, "production": {"values": {"region": "eu"}, "secrets": {}} } } ``` [configWaarde](../ingebouwde-functies/configWaarde.md) leest een gedeclareerde sleutel. [configOmgeving](../ingebouwde-functies/configOmgeving.md) geeft `development`, `test` of `production` terug; standaard is `development`. Elke omgeving staat 32 waarden en 32 geheimen toe. Host-JSON is begrensd op 64 KiB. De taal kan geheimwaarden niet lezen. De host voegt het genoemde geheim alleen bij zijn toegestane origin toe aan Authorization. Dit is expliciete configuratie via een hostbestand, geen versleutelde sleutelhanger of gehoste kluis. Procesomgevingsvariabelen worden niet impliciet gelezen. ## CLI en gegenereerde applicaties Opties staan vóór het projectpad: ```sh pliro run --allow-database --allow-advanced-network --allow-https https://api.example.com --select-file input=/gekozen/invoer.txt --writable-directory reports=/gekozen/rapporten --configuration /prive/config.json --environment test voorbeeld.bipli ``` Ook `--select-directory` en `--writable-file` zijn beschikbaar. Debugger en profiler accepteren dezelfde toestemmingen. Ondersteunde native exports bevatten de geavanceerde runtime en vereisen Go 1.25 of nieuwer tijdens het bouwen. Een gegenereerde app bevat geen Pliro-productlicentiecontrole. De gebruiker geeft geavanceerde toestemmingen bij het starten: ```sh mijn-app --pliro-permissions /prive/toestemmingen.json ``` ```json { "schemaVersion": 1, "grants": { "sqlite": true, "network": true, "httpsOrigins": ["https://api.example.com"], "files": {"input": {"path": "/gekozen/invoer.txt", "write": false}}, "directories": {"reports": {"path": "/gekozen/rapporten", "write": true}}, "environment": "production" }, "configurationPath": "/prive/config.json" } ``` Gebruik passende paden voor de machine van de gebruiker. Dit hostbestand wordt niet in de export opgenomen. Zonder dit bestand is geen geavanceerde toegang verleend. Grafische native apps gebruiken nu ook dit startbestand; een grafische keuzedialoog voor geavanceerde toegang is niet beschikbaar. Core HTTPS GET houdt zijn afzonderlijke `--pliro-allow-https` of grafische toestemming wanneer beide soorten API's worden gebruikt. `--pliro-third-party-notices` toont meegeleverde afhankelijkheidslicenties. [Ontwikkelgereedschap](ontwikkelgereedschap.md) · [Bouwen en exporteren](apps-bouwen.md) · [Ingebouwde functies](../ingebouwde-functies/LEESMIJ.md)