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 soubory větší než 2GB. Doporučujeme aby partner respektoval download_preference atribut, který indikuje doporučené rozdělení downloadu.Specifika e-knih:
Doplňkové soubory (addons)
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ů
| State ID | API State Name | Název (Czech) | can_sell | can_download | can_view |
|---|---|---|---|---|---|
| 1 | content_control | Kontrola obsahu | f | f | f |
| 2 | active | V prodeji | t | t | t |
| 3 | in_progress | Rozpracováno | f | f | f |
| 4 | canceled | Prodej ukončen | f | t | f |
| 5 | preparing | Připravujeme | f | f | t |
| 6 | presale | Předprodej | t | t | t |
| 10 | to_fix | K opravě | f | f | f |
| 11 | approved | Schváleno | f | f | f |
| 12 | not_preparing | Už nepřipravujeme | f | f | f |
| 13 | preparing_content_control | Připravujeme - kontrola obsahu | f | f | t |
| 14 | preparing_approved_for_sale | Připravujeme - schváleno k prodeji | f | f | t |
| 15 | preparing_to_fix | Připravujeme - k opravě | f | f | t |
| 16 | waiting_for_publication | Čeká na zveřejnění | f | f | f |
| 17 | canceled_content_control | Zrušeno - kontrola obsahu | f | f | f |
| 18 | canceled_waiting_for_publication | Zrušeno - čeká na zveřejnění | f | f | f |
| 19 | canceled_to_fix | Zrušeno - k opravě | f | f | f |
| 20 | on_hold_content_issue | Pozastaveno - chyba obsahu | f | f | f |
| 21 | on_hold_content_issue_fixed | Pozastaveno - chyba obsahu opravena | f | f | f |
| 22 | locked_for_publisher | Uzamčeno pro vydavatele | f | f | f |
| 23 | presale_content_control | Předprodej - kontrola obsahu | t | f | t |
| 24 | presale_to_fix | Předprodej - k opravě | t | f | t |
| 25 | presale_waiting_for_publication | Předprodej - čeká na zveřejnění | t | f | t |
| 26 | presale_canceled | Předprodej - ukončeno | f | f | t |
| 27 | presale_canceled_content_control | Předprodej - ukončeno - kontrola obsahu | f | f | t |
| 28 | presale_canceled_to_fix | Předprodej - ukončeno - k opravě | f | f | t |
| 29 | presale_canceled_waiting_for_publication | Předprodej - ukončeno - čeká na zveřejnění | f | f | t |
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)