Naše JSON-RPC rozhraní myšlenkově vychází z XML-RPC, ale řeší některé jeho nedostatky pro jednodušší používání.
Název volané metody je cesta v URL, takže například volání metody items se zapíše jako /items.
Tento JSON-RPC server umožňuje volání metod několika způsoby:
_, _callback, nebo callback. Jakmile volání obsahu jeden z těchto parametrů, automaticky se odpovídá pomocí JSONP. Více o JSONP na Wikipedii.Content-Type: application/x-www-form-urlencoded.application/json, text/json, nebo text/plain pro JSON a application/bson pro BSON.Rozhraní odpovídá buďto JSONem, jebo BSONem a to podle HTTP hlavičky Accept. Výchozí formát odpovědi je JSON.
Odpověď vždy obsahuje objekt s klíči status a status_message. Status je číselný stav vyřízení volání podobný stavovým kódům HTTP, ale může se lišit tam, kde neexistuje odpovídající HTTP status. Status_message pak obsahuje textový popis výsledku volání. V případě úspěšného volání je odpověď {"status":200, "status_message": "OK"}.
Pokud volání vrací nějaká data, kořenový objekt obsahuje ještě klíč s názvem volané metody.
GET /system_list_methods HTTP/1.0
User-Agent: curl/7.37.1
Host: dummy.grandit.cz:1200
Accept: */*
HTTP/1.1 200 OK
Content-Type: application/json
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Reply-OK-Only
Connection: Close
Content-Length: __
{
"status_message": "OK",
"system_list_methods": [
"system_alive",
"system_list_methods",
"system_method_help",
"system_method_info",
"system_method_sig",
"system_multicall",
"system_status",
],
"status": 200
}
Pokud do vstupního pole, zadáte adresu našeho RPC rozhraní, můžete klikem na tlačítko načíst jeho konfiguraci. S konfigurací rozhraní se načítají jak signatury metod, tak nápověda. Pomocí tohoto rozhraní je také možné jednotlivé metody provolat a zovnou se podívat na návratové hodnoty.
API slouží pro distribuci digitálního obsahu, jako jsou e-knihy, nebo audioknihy, umožnuje získání a aktualizaci metadat zboží, cen, obálek a audio náslechů. Zpřístupňuje zboží ke stažení pro koncové uživatele. Rozsah dostupného katalogu je závislý na smlouvě o distribuci.
Typy a formáty poskytované na API
Typický průchod na API
Zde uvádíme obecné shrnutí a předpoklady pro práci s API. Popis vstupních parametrů, obsah odpovědí a seznam výjimek/chybových kódů je pak rozepsán u nápovědy jednotlivých metod.
Metody API jsou rozděleny do základních skupin dle typu obsahu (z důvodu rozdílného datového výstup), nebo účelu použití.
Skupiny API metod audiobooks a ebooks fungují v principu stejně, liší se pouze v názvech v některých metadatech a v detailech stažení některých typů souborů.
Audiobooks slouží k přístupu k datům audioknih.
catalogue_export_get_filecatalogue_updatescatalogue_updates_idscatalogue_listdownloaddownload_packagestream_trackEbooks slouží k přístupu k datům e-knih.
catalogue_export_get_filecatalogue_updatescatalogue_updates_idscatalogue_listdownloaddownload_addonReporting slouží k reportování nákupu, či storna objednávky položek a je společný pro oba typy obsahu.
report_paymentreport_payment_cancelping může sloužit pro monitoring ze strany partnera. Pokud by partner použil pro monitoring nevhodné metody, jako získání katalogu, je zde riziko zablokování přístup na API z důvodu nepřiměřené zátěže.categories vrací seznam všech aktivních kategorií.Systém generuje minimálně jednou každý den export celého katalogu. Následně existují 2 možnosti jak katalog aktualizovat. Na diagramech jsou zobrazeny oba postupy průchodu pro získání a aktualizaci katalogu.
Aktulálně doporučovaným přístupem je načtení seznamu změněných ID položek a jejich následné zpracování pomocí category_list. Tato metoda poskytuje efektivnější přístup ke zpracování změnových položek a v případě větších změn katalogu, si distributor může tyto změny zpracovávat po dávkách.
Výchozí metoda pro první načtení kompletního katalogu je catalogue_export_get_file. Výstupem je url na JSON soubor s kompletním katalogem a informací, kdy byl tento soubor naposledy vygenerován a tedy k jakému datum jsou informace v něm aktuální (generuje se typicky 1x denně mezi 1:00-3:00).
Po prvotním importu katalogu je možné používat metody catalogue_updates_ids, catalogue_list a catalogue_updates pro načtení pouze změněných položek. Nicméně doporučujeme zkontrolovat pomocí metody catalogue_export_get_file kompletní katalog, alespoň jednou za 14 dní, aby se odstranily případné chyby způsobené časovými překryvy, případně nějakými většími změnami v katalogu.
Při implementaci je potřeba počítat s tím, že s ohledem na typ a množství dostupného zboží, může mít výsledný JSON soubor velikost v řádech desítek MB.
Zjištění změn v katalogu.
API poskytuje dva způsoby, jak získat informace o aktualizovaném zboží. Aktuálně doporučovaný způsob vrací datově úsporný seznam ID zboží, který lze pak použít pro získání metadat v metodě catalogue_list a takovýto seznam lze dle potřeby rozdělit do dávek . Původní způsob poskytuje plná metadata všech změněnch položek, a v případě vetšího množství změn, mohou být výstupní data obsáhlá.
aktulální doporučovaný způsob:
catalogue_updates_ids
catalogue_list
catalogue_list je možné použít jakýkoli seznam ID. (Příkladem využití muže být např. administrace partnera, kde v detailu zboží lze mít tlačítko na aktualizaci metadat, pak by se tato metoda volala právě s jedním ID daného zboží).původní způsob
catalogue_updatesStahování probíhá pomocí metody download, stream_track, download_package či download_addon, které vrací url pro stažení požadovaného souboru. Většina souborů je k dispozici ihned ke stažení. Vydané linky mají omezenou platnost a nejsou určeny k ukládání na straně partnera. Soubory také obsahují DRM, proto je potřeba při žádosti o ně předat relevantní data.
Odložené stahování:
download a download_package. (Tzn netýká se streamingu ani addons)download / download_package.downloader_version (1 = původní host abdwn, 2 = nový host dwn). Bez parametru se použije výchozí verze partnera. Parametr mimo allowlist se ignoruje. Jde o přechodný souběh, po dokončení migrace se zruší.Specifika audioknih:
stream_track. Link pro jednotlivý track vygenerovaný přes download není určen ke streamingu a v případě využití tímto způsobem se partner vystavuje riziku nefunkčnosti, či odstavení API.download a download_package mají limit 2 GB. U souborů větších než 2 GB je nutné respektovat atribut download_preference, který indikuje požadované rozdělení downloadu. Partner musí atribut vyhodnotit a stáhnout obsah přes odpovídající entitu. Atribut nesmí ignorovat, jinak se soubor nevytvoří.collection — celá audiokniha najednou (download s item_id kolekce).volume — nelze stáhnout jako celek, pouze po jednotlivých volume (item_id volume).track — nelze stáhnout jako celek ani po volume, pouze po jednotlivých trackách (item_id tracku).Specifika e-knih:
Doplňkové soubory (addons)
Následující chyby vrací HTTP GET na URL, kterou vrátily metody download (audioknihy i e-knihy) a download_package (audioknihy). Nejde o chybu JSON-RPC volání, které URL vydá. Text níže je status_message odpovědi.
Chyba sestavení souboru ke stažení, na opravě pracujeme, opakujte stažení později prosím, případně kontaktuje zákaznický servis prodejce. Integrátor stažení zopakuje později. Když chyba přetrvává, kontaktuje zákaznický servis prodejce.Časový limit pro sestavení souboru ke stažení vypršel, opakujte stažení později prosím, případně kontaktujte zákaznický servis prodejce. Stejný postup: zopakovat stažení později, při přetrvávající chybě kontaktovat zákaznický servis prodejce.Ticket vypršel. Integrátor vyžádá nový ticket novým voláním download nebo download_package. Původní URL znovu nepoužívá.Volání metod ebooks/download, ebooks/download_addon, audiobooks/download a audiobooks/download_package podléhá omezení počtu žádostí.
Hodnoty limitu jsou řízeny interně na straně serveru a jedná se o globální nastavení pro celé API. Pro unikátní kombinaci parametrů user_id, item_id a order_id je možné odeslat maximálně 10 požadavků v časovém okně 60 sekund. Při překročení tohoto limitu vrátí API chybovou odpověď (HTTP status:429 status v json datech odpovědi:429).
Proces streamingu placeného obsahu využívá odkazy s dynamickou platností, která je řízena dvěma parametry: - Počáteční expirace (expiration): Určuje, jak dlouho je nově vygenerovaný link platný, než ho uživatel poprvé použije. (Aktuálně: 24 hodin) - Prodloužená expirace (expiration_prolong): Jakmile uživatel zahájí streaming, původní expirace se nahradí tímto kratším časovým limitem pro všechny následující požadavky na data. (Aktuálně: 1 hodina)
Pokud link není využit v rámci těchto dvou po sobě jdoucích časových limitů, stává se neplatným. Pro pokračování v poslechu je pak vždy nutné prostřednictvím API vygenerovat nový link.
Jedním z nejdůležitějších aspektů zpracování katalogu a zařazení do nabídky je vyhodnocení dostupnosti/platnosti licence, cenotvorba, zařazení do stromu kategorii. Zde jsou popsány obecně, ve větším detailu včetně popisu jednotlivých hodnot v popisu každé metody.
Je řešena kombinací hodnot stavu zboží a dostupnosti v čase od a do.
Tabulka stavů
Katalog v poli state vrací jen tyto čtyři hodnoty.
| API State Name | Název | can_sell | can_download | can_view |
|---|---|---|---|---|
| active | V prodeji | t | t | t |
| preparing | Připravujeme | f | f | t |
| presale | Předprodej | t | t | t |
| canceled | Prodej ukončen | f | t | f |
Tabulka dostupnosti
| available_from | available_to | cílový stav | poznámka |
|---|---|---|---|
| null | null | beze změny | |
| null | v minulosti | neplatná licence | |
| null | v budoucnosti | beze změny | |
| v minulosti | null | beze změny | |
| v minulosti | v minulosti | neplatná licence | |
| v minulosti | v budoucnosti | beze změny | |
| v budoucnosti | null | neplatná licence, s výjimkou zobrazení pro stav preparing | |
| v budoucnosti | v minulosti | neplatná licence | logicky nedává smysl, kombinace je chybný stav |
| v budoucnosti | v budoucnosti | neplatná licence, s výjimkou zobrazení pro stav preparing |
Ceny se zobrazují v několika variantách v datech v objektu prices.
Měna cen - CZK.
DPH je nedílnou součástí ceny v daném časovém období.
generic/categories.generic/categories, ale po přechodnou dobu mohou bude vracena z api u položek tak, aby bylo možné změnu v kategoriích zohlednit.Pro párování zboží audiokiha-ekniha lze využít atribut print_isbns, který obsahuje všechna isbn tištěných knih, které korespondují s touto elektronickou verzí. Obsah tohoto atributu je v současné době omezen vzhledem k dotupným podkladům od vydavatů, ale bude se v budoucnosti doplňovat. Pokud prodejce prodává i tištěné varianty knih, může je pomocí tohoto atributu párovat také.
Distributor reportuje prodeje prostřednictvím metody report_payment . Uvádí datum a čas vzniku platby, kdy k tomuto okamžiku je pak prováděna kontrola prodejní ceny pro vyúčtování. Reportovat prodeje lze nejpozději do 24h po zaplacení, v opačném případě API vyhlásí chybu. Metoda volitelně přijímá i informaci o doplňkovém kanále prodeje, kde je možno rozlišit nákupy z aplikace a z webu, či cokoliv jiného, Tato hodnota se pak v textové formě může objevit ve výůčtování partnerovi, bez vlivu na výpočet.
Metoda report_payment vrací id objednávky ze seznamu BookUP, partner by se měl toto ID ukládat pro případné párování objednávek v jeho systému, případně pro případ reklamace.
Metoda report_payment umožňuje vyreportovat testovací objednávku, která bude vyřazena z vyúčtování, Testovací objednávka musí být označena správným parametrem, viz detailní nápověda metody.
Reportovanou objednávku je možné zrušit pomocí volání report_payment_cancel. Kdy je vhodné uvádět důvod reklamace z dostupného seznamu popsaného v detailu této metody, maximálně 24h zpětně.
var dist_id = pm.environment.get('dist_id') || ''
var secret = pm.environment.get('jwt_secret') || ''
var pathParts = pm.request.url.path
var method = pathParts.join('/')
var timestamp = Date.now()/1000;
var payload = {
"exp": timestamp,
"method": method,
"dist_id": parseInt(dist_id)
}
var header = {
"alg": "HS512",
"typ": "JWT"
}
var result = CryptoJS.enc.Base64.stringify(
CryptoJS.enc.Utf8.parse(
JSON.stringify(header)
)
)
result += ".";
result += CryptoJS.enc.Base64.stringify(
CryptoJS.enc.Utf8.parse(
JSON.stringify(payload)
)
).replace(/=/g, "")
verify=CryptoJS.HmacSHA512(result , secret).toString(CryptoJS.enc.Base64).replace(/\+/g,'-').replace(/\//g,'_').replace(/\=+$/m,'');
result += ".";
result += verify
pm.collectionVariables.set('jwt_token', result)