Objekty OpenAPI JSON ako parametre dotazu

1. Prehľad

V tomto výučbe sa naučíme pracovať s Objekty JSON ako parametre dotazu pomocou OpenAPI.

2. Parametre dotazu v OpenAPI 2

OpenAPI 2 nepodporuje objekty ako parametre dotazu; podporované sú iba primitívne hodnoty a polia primitívnych prvkov.

Z tohto dôvodu budeme namiesto toho chcieť definovať náš parameter JSON ako a struna.

Aby sme to videli v akcii, definujme parameter s názvom params ako povrázok, aj keď to v našom backende rozoberieme ako JSON:

swagger: "2.0" ... cesty: / vstupenky: get: tagy: - "vstupenky" zhrnutie: "Poslať objekt JSON ako dopyt param" parametre: - názov: "params" v: "cesta" popis: "{ \ "type \": \ "foo \", \ "color \": \ "zelená \"} "povinný údaj: pravý typ:" reťazec " 

Teda namiesto:

ZÍSKAŤ // localhost: 8080 / api / vstupenky? Type = foo & color = green

urobíme:

ZÍSKAŤ // localhost: 8080 / api / vstupenky? Params = {"type": "foo", "color": "green"}

3. Dotaz na parametre v OpenAPI 3

OpenAPI 3 zavádza podporu pre objekty ako parametre dotazu.

Ak chcete určiť parameter JSON, musíme pridať a obsah časť našej definície, ktorá obsahuje typ a schému MIME:

openapi: 3.0.1 ... cesty: / vstupenky: get: tagy: - prehľad vstupeniek: odoslanie objektu JSON ako dotazu parametre parametre: - názov: parametre v: popis dotazu: '{"type": "foo", "color": "green"} 'vyžadované: true schéma: type: vlastnosti objektu: type: type: "string" color: type: "string" 

Naša požiadavka môže teraz vyzerať takto:

ZÍSKAŤ // localhost: 8080 / api / vstupenky? Parametre [typ] = foo¶ms [farba] ​​= zelená

A v skutočnosti to môže stále vyzerať takto:

ZÍSKAŤ // localhost: 8080 / api / vstupenky? Params = {"type": "foo", "color": "green"}

Prvá možnosť nám umožňuje používať validácie parametrov, ktoré nás pred odoslaním žiadosti informujú, či niečo nie je v poriadku.

S druhou možnosťou to obchodujeme pre väčšiu kontrolu nad backendom, ako aj pre kompatibilitu OpenAPI 2.

4. Kódovanie URL

Je dôležité si uvedomiť, že pri tomto rozhodovaní o prenose parametrov požiadavky ako objektu JSON budeme chcieť kódovať URL, aby sme zaistili bezpečný prenos.

Takže na odoslanie nasledujúcej adresy URL:

ZÍSKAŤ / lístky? Params = {"type": "foo", "color": "green"}

Vlastne by sme robili:

ZÍSKAŤ / letenky? Parametre =% 7B% 22typ% 22% 3A% 22foo% 22% 2C% 22color% 22% 3A% 22zelená% 22% 7D

5. Obmedzenia

Pamätajme tiež na obmedzenia týkajúce sa odovzdávania objektu JSON ako množiny parametrov dotazu:

  • znížená bezpečnosť
  • obmedzená dĺžka parametrov

Napríklad, čím viac údajov umiestnime do parametra dotazu, čím viac sa zobrazí v protokoloch servera a tým vyšší je potenciál vystavenia citlivým údajom.

Jeden parameter dopytu tiež nemôže mať viac ako 2 048 znakov. Určite si všetci dokážeme predstaviť scenáre, keď sú naše objekty JSON väčšie ako to. Prakticky povedané, kódovanie URL nášho reťazca JSON nás v skutočnosti obmedzí na asi 1 000 znakov pre naše užitočné zaťaženie.

Jedným z riešení je poslať väčšie objekty JSON do tela. Týmto spôsobom opravíme problém so zabezpečením aj obmedzenie dĺžky JSON.

Vlastne, Podporuje to GET alebo POST. Jedným z dôvodov, prečo poslať telo cez GET, je zachovať sémantiku RESTful nášho API.

Je to samozrejme trochu neobvyklé a nie všeobecne podporované. Napríklad niektoré knižnice HTTP JavaScriptu neumožňujú požiadavkám GET mať telo žiadosti.

Stručne povedané, táto voľba predstavuje kompromis medzi sémantikou a univerzálnou kompatibilitou.

6. Záver

Ak to zhrnieme, v tomto článku sme sa naučili, ako špecifikovať objekty JSON ako parametre dotazu pomocou OpenAPI. Potom sme pozorovali niektoré dôsledky na backend.

Kompletné definície OpenAPI pre tieto príklady sú k dispozícii na GitHub.