API:Continue/cs
Verze MediaWiki: | ≥ 1.26 |
Velmi často nezískáte všechna požadovaná data v jednom API dotazu.
Když k tomu dojde, rozhraní API k výsledkům připojí další prvek (s názvem continue
), který označuje, že existuje více dat.
Prvek, který se vrátí, bude mít dvě části: Jedna část bude dílčí prvek také nazvaný continue
.
To bude mít obvykle přidruženou hodnotu, která zahrnuje symboly ||
, pokud jsou k dispozici data pro pokračování.
Druhá část bude dílčí prvek (nebo více dílčích prvků), jehož název je zkratkou toho, který seznam je použit v dotazu, s předponou na slovo continue
.
(Takže například dílčí prvek pro dotaz používající categorymembers by byl cmcontinue
, dílčí prvek pro dotaz používající allcategories by byl accontinue
, dílčí prvek pro dotaz pomocí protectedtitles by byl ptcontinue
atd.)
Chcete-li načíst další data, když je přítomen prvek continue
, musíte přidat druhý dílčí prvek jako parametr k dalšímu požadavku API.
Pokud například dotaz používající seznam allcategories obsahoval další výsledky, pak by další dotaz API měl obsahovat accontinue=
jako parametr spolu s jakoukoli hodnotou accontinue
ve výsledcích prvního dotazu.
Chcete-li získat všechny výsledky, lze to opakovat, dokud výsledek rozhraní API nebude mít ve výsledcích prvek continue
, což znamená, že dotazu neodpovídají žádná další data.
batchcomplete
Když odešlete požadavek API pomocí generátoru spolu s vlastnostmi, výsledek API může signalizovat pokračování, protože zatím existuje více vlastností k načtení pro stránky (v takovém případě je vrácena stejná sada stránek, ale s další sadou vlastností), protože existuje více stránek z generátoru, nebo obojí.
Od verze 1.25 vrací API prvek batchcomplete
, který označuje, že byla vrácena všechna data pro aktuální "dávku" stránek a prvek continue
neobsahuje data pokračování pro vlastnosti, ale místo toho může obsahovat data pokračování pro generátor.
To může být užitečné, abyste se vyhnuli vytváření kombinované sady výsledků pro tisíce stránek při použití generátoru společně s pomocnými moduly, které samy o sobě mohou vyžadovat pokračování.
Zpětná kompatibilita continue
Verze MediaWiki: | ≥ 1.9 |
Od MediaWiki 1.21 až 1.25 bylo nutné v počátečním požadavku zadat continue=
(tj. s prázdným řetězcem jako hodnotou), aby bylo možné získat data o pokračování ve výše popsaném formátu.
Bez toho by výsledky API indikovaly, že jsou zde další data, a to vrácením prvku query-continue
, jak je vysvětleno v Nezpracovaný dotaz pokračovat .
Před 1.21 bylo toto nezpracované pokračování jedinou možností.
Pokud vaše aplikace potřebuje používat nezpracované pokračování v MediaWiki 1.26 nebo novější, musíte zadat rawcontinue=
, abyste o něj požádali.
Příklady
Příklad 1: Pokračování allcategories
allcategories
seznam k vyžádání výsledků, které překračují výchozí limit , a proto je potřeba pokračovat, aby se vrátily další výsledky. Všimněte si, že protože je použit seznam allcategories
, má druhý dílčí prvek continue
název accontinue
.Výsledek |
---|
"continue": {
"accontinue": "List_of_19th_century_baseball_players",
"continue": "-||"
},
"batchcomplete": "",
"query": {
"allcategories": [
{
"*": "List of"
},
{
"*": "List of Palestinians"
},
{
"*": "List of \"M\" series military vehicles"
},
{
"*": "List of ''The Fast and the Furious'' characters"
},
{
"*": "List of 100 Deeds for Eddie McDowd"
},
{
"*": "List of 1919 Actors"
},
{
"*": "List of 1972 births"
},
{
"*": "List of 1999 ballet premieres"
},
{
"*": "List of 19th-century Russian artists"
},
{
"*": "List of 19th century Russian artists"
}
]
}
}
|
Příklad 2: Pokračování categorymembers
categorymembers
list k vyžádání výsledků, které překračují limit (cmlimit
), a proto je potřeba pokračovat, aby se vrátily další výsledky. Všimněte si, že protože je použit seznam categorymembers
, má druhý dílčí prvek continue
název cmcontinue
.Výsledek |
---|
{
"batchcomplete": true,
"continue": {
"cmcontinue": "page|2a2a4c4e2a402a443e382a403a30011201dc11|21583092",
"continue": "-||"
},
"query": {
"categorymembers": [
{
"pageid": 3801230,
"ns": 10,
"title": "Template:User history"
},
{
"pageid": 7769732,
"ns": 10,
"title": "Template:User history2"
},
{
"pageid": 56312624,
"ns": 10,
"title": "Template:User history3"
},
{
"pageid": 8364349,
"ns": 2,
"title": "User:-1348-"
},
{
"pageid": 12553892,
"ns": 2,
"title": "User:(RT)"
},
{
"pageid": 60272884,
"ns": 2,
"title": "User:MPSHeritage"
},
{
"pageid": 42055428,
"ns": 2,
"title": "User:Tyssil"
},
{
"pageid": 10356432,
"ns": 2,
"title": "User:1GoodNight4Life"
},
{
"pageid": 59180278,
"ns": 2,
"title": "User:1I0I1I0I1I0"
},
{
"pageid": 51651783,
"ns": 2,
"title": "User:01iproject09"
},
{
"pageid": 29595961,
"ns": 2,
"title": "User:3family6"
},
{
"pageid": 43181830,
"ns": 2,
"title": "User:3family6/Education and interests"
},
{
"pageid": 17919048,
"ns": 2,
"title": "User:03md"
},
{
"pageid": 44202586,
"ns": 2,
"title": "User:4Sage Wiki"
},
{
"pageid": 64607473,
"ns": 2,
"title": "User:05Pier"
},
{
"pageid": 46626298,
"ns": 2,
"title": "User:16pedia2"
},
{
"pageid": 33371141,
"ns": 2,
"title": "User:17adavis7"
},
{
"pageid": 15797963,
"ns": 2,
"title": "User:21stCenturyGreenstuff"
},
{
"pageid": 61571792,
"ns": 2,
"title": "User:28regiment"
},
{
"pageid": 17053340,
"ns": 2,
"title": "User:37ophiuchi"
},
{
"pageid": 9781448,
"ns": 2,
"title": "User:88wolfmaster"
},
{
"pageid": 17120424,
"ns": 2,
"title": "User:88wolfmaster/Userboxes"
},
{
"pageid": 16369371,
"ns": 2,
"title": "User:123w456t"
},
{
"pageid": 69413683,
"ns": 2,
"title": "User:296cherry"
},
{
"pageid": 41449363,
"ns": 2,
"title": "User:636Buster"
},
{
"pageid": 8451054,
"ns": 2,
"title": "User:1549bcp"
},
{
"pageid": 26153484,
"ns": 2,
"title": "User:1951bfrj"
},
{
"pageid": 28820985,
"ns": 2,
"title": "User:11614soup"
},
{
"pageid": 69602489,
"ns": 2,
"title": "User:16272js"
},
{
"pageid": 9578722,
"ns": 2,
"title": "User:A Geographer"
},
{
"pageid": 36155511,
"ns": 2,
"title": "User:A knyght ther was"
},
{
"pageid": 6637293,
"ns": 2,
"title": "User:A student of history"
},
{
"pageid": 22308356,
"ns": 2,
"title": "User:A Werewolf"
},
{
"pageid": 39893010,
"ns": 2,
"title": "User:A. Pseudonym"
},
{
"pageid": 36267514,
"ns": 2,
"title": "User:A.Aboumrad"
},
{
"pageid": 8475873,
"ns": 2,
"title": "User:A.Arc"
},
{
"pageid": 5283037,
"ns": 2,
"title": "User:A.J.Chesswas"
},
{
"pageid": 26516505,
"ns": 2,
"title": "User:A.kamburov"
},
{
"pageid": 40306753,
"ns": 2,
"title": "User:A.sky245"
},
{
"pageid": 6320018,
"ns": 2,
"title": "User:A.Zhubrovsky"
},
{
"pageid": 68777172,
"ns": 2,
"title": "User:A2Bros"
},
{
"pageid": 26764821,
"ns": 2,
"title": "User:A2soup"
},
{
"pageid": 68203375,
"ns": 2,
"title": "User:A0231050705"
},
{
"pageid": 26356724,
"ns": 2,
"title": "User:Aaa8841"
},
{
"pageid": 61127272,
"ns": 2,
"title": "User:Aaghi"
},
{
"pageid": 5410981,
"ns": 2,
"title": "User:Aak044"
},
{
"pageid": 23936323,
"ns": 2,
"title": "User:Aardvarkzz"
},
{
"pageid": 2934321,
"ns": 2,
"title": "User:Aaron of Mpls"
},
{
"pageid": 40974272,
"ns": 2,
"title": "User:Aaron-Kocourek"
},
{
"pageid": 13618776,
"ns": 2,
"title": "User:Aaroncorey"
}
]
}
}
|
Příklad 3: Kód Pythonu pro iteraci všech výsledků
Zde je kód Pythonu, který ukazuje, jak opakovat výsledky dotazu (pomocí requests na python lib).
Všimněte si, že byste neměli manipulovat ani se spoléhat na žádná specifika hodnot vrácených uvnitř prvku continue
, protože se mohou změnit.
for result in query({'generator': 'allpages', 'prop': 'links'}):
# process result data
...
def query(request):
request['action'] = 'query'
request['format'] = 'json'
last_continue = {}
while True:
# Clone original request
req = request.copy()
# Modify it with the values returned in the 'continue' section of the last result.
req.update(last_continue)
# Call API
result = requests.get('https://en.wikipedia.org/w/api.php', params=req).json()
if 'error' in result:
raise Exception(result['error'])
if 'warnings' in result:
print(result['warnings'])
if 'query' in result:
yield result['query']
if 'continue' not in result:
break
last_continue = result['continue']