API:Vorlagenparameter

From mediawiki.org
This page is a translated version of the page API:Templated parameters and the translation is 100% complete.

Mit Stand MediaWiki 1.32 können API-Anrufe zwei Level-Arrays nutzen, um Daten an die API zu ĂŒbergeben. Dadurch werden die fĂŒr API-Server verfĂŒgbaren Datenformate zum Erhalt von Argumenten von API-Clients erweitert.

Überblick

Die API-Struktur erlaubt API-Anrufen, zwei Stufen von Argumenten zur Auswertung an eine API zu ĂŒbergeben.

  • Ein Modul kann einen Vorlagenparameter wie "{frucht}-menge" definieren, wobei die erkannten Parameter den Werten eines Parameters mit mehreren Werten entsprechen. Clients können dann Abfragen wie "fruits=apples|bananas&apples-quantity=1&bananas-quantity=5" stellen.
  • action=paraminfo wird Vorlagenparameter-Definitionen getrennt von normalen Parametern ausgeben. Alle Parameter-Definitionen enthalten nun einen "Index"-SchlĂŒssel, um es Clients zu ermöglichen, eine Parameter-Sortierung zu pflegen, wenn normale und Vorlagenparameter vermischt werden.
FrĂŒchte Menge
Äpfel 1
Bananen 5

Client-API

Der Client kann Vorlagenparameter genau so verwenden, wie ein Webservice aufgerufen wird, wobei Abfrage-Zeichenketten-Argumente oder HTTP-POST-Argumente genutzt werden.

Parameterinformationen

Die "paraminfo"-API-Abfrage kann genutzt werden, um die API ĂŒber die Struktur ihrer Parameter abzufragen.

In diesem Beispiel heißt die Erweiterung ParameterTemplateDemo.

FĂŒr eine Beispiel-Entwicklungsmaschine (Wiki befindet sich unter machine/wikiprefix) wĂ€re die API-Test-URL: http://machine/wikiprefix/api.php?action=paraminfo&modules=ParameterTemplateDemo

was folgendes ergeben wĂŒrde:

{
    "paraminfo": {
        "helpformat": "none",
        "modules": [
            {
                "name": "ParameterTemplateDemo",
                "classname": "ParameterTemplateDemoAPI",
                "path": "ParameterTemplateDemo",
                "group": "action",
                "prefix": "",
                "source": "ParameterTemplateDemo",
                "sourcename": "ParameterTemplateDemo",
                "readrights": "",
                "helpurls": [],
                "parameters": [
                    {
                        "index": 1,
                        "name": "fruits",
                        "required": "",
                        "multi": "",
                        "lowlimit": 50,
                        "highlimit": 500,
                        "limit": 500,
                        "type": "string"
                    }
                ],
                "templatedparameters": [
                    {
                        "index": 2,
                        "name": "{f}-quantity",
                        "templatevars": {
                            "f": "fruits"
                        },
                        "multi": "",
                        "lowlimit": 50,
                        "highlimit": 500,
                        "limit": 500,
                        "type": "integer"
                    }
                ]
            }
        ]
    }
}

Server-API-Implementation

Dieser Abschnitt soll Entwicklern von Erweiterungen helfen, die als Teil ihrer Erweiterung neue APIs einfĂŒhren möchten.

HinzufĂŒgen von Erweiterungen

Wie bei allen Erweiterungen muss ein einzigartiges Verzeichnis zum Verzeichnis der MediaWiki-Erweiterung hinzugefĂŒgt werden. In diesem Beispiel heißt die Erweiterung "MyExample".

LocalSettings.php muss einen Verweis auf die neue Erweiterung enthalten, wie:

wfLoadExtension( 'MyExample' );

Die JSON-Datei der Erweiterung hat den Namen extension.json im Haupt-Verzeichnis des Ordners der Erweiterung (in diesem Fall /extensions/ParameterTemplatesDemo/extension.json) und enthĂ€lt den Namen, Version, Beschreibung, APIModule und EintrĂ€ge zu AutoloadKlassen. Die Verweise auf Spezialseiten und Ressourcen-Module dienen fĂŒr clientseitige Abfragen.

{
	"name": "MyExample",
	"version": 1,
	"description": "Example that demonstrates API parameterized templates (both client and server)",
	"type": "other",

	"@APIModules": "Key is the API module name (lowercase, used for the api.php action parameter). Value is the PHP class that implements it.",
	"APIModules": {
		"parameterdemo": "MediaWiki\\Extension\\MyExample\\ApiParameterDemo"
	},
	"MessagesDirs": {
		"MyExample": [
			"i18n"
		]
	},
	"ResourceModules": {
		"ext.MyExample": {
			"packageFiles": [
				"modules/ext.MyExample/demo.js"
			],
			"dependencies": [
				"mediawiki.api",
				"mediawiki.util"
			]
		}
	},
	"AutoloadNamespaces": {
		"MediaWiki\\Extension\\MyExample\\" : "includes/"
	},
	"manifest_version": 1
}

I18N

Die Server-Implementation verlĂ€sst sich auf ein gĂŒltiges i18n-Verzeichnis und eine existierende JSON-Datei, die jedoch in diesem Beispiel noch nicht genutzt werden.

Implementierungsklasse

Die Implementierungsklasse muss sich im eingeschlossenen Verzeichnis befinden. Die Implementierungsklasse muss die BenutzeroberflÀche von ApiBase.php implementieren.

<?php

namespace MediaWiki\Extension\MyExample;

class ApiParameterTemplateDemo  extends ApiBase {

    public function getAllowedParams() {
        return array(
            'fruits' => array (
                ApiBase::PARAM_TYPE => 'string',
                ApiBase::PARAM_REQUIRED => true,
                ApiBase::PARAM_ISMULTI => true,
            ),
            '{f}-quantity'=> array(
                ApiBase::PARAM_TYPE => 'integer',
                ApiBase::PARAM_ISMULTI => true,
                // a reference to prior parameter
                ApiBase::PARAM_TEMPLATE_VARS => [ 'f' => 'fruits'],
            )
        );
    }

    public function execute() {
        $result = $this->getResult();

        $requestValues = $this->getRequest()->getQueryValues();
        $fruits = explode('|', $this->getRequest()->getVal('fruits'));
        
        // wfDebug( __METHOD__ . ': fruits = ' . json_encode( $fruits ) );
        
        foreach ($fruits as $fruit) {
            $quantity = $this->getRequest()->getVal($fruit . '-quantity');
            // wfDebug( "$fruit is $quantity" );
            $result->addValue( null, $fruit, $quantity );
        }
     }
}

Diese Klasse kann getestet werden, indem das integrierte API-Test-Modul genutzt wird. Die URL wÀre http://machine/wikiprefix/api.php?action=ParameterTemplateDemo&fruits=apples%7Cbananas&apples-quantity=1&bananas-quantity=5

Im Prinzip ein "Hallo Welt", diese Antwort gibt nur das zurĂŒck, was mit der Abfrage-Zeichenkette ĂŒbergeben wurde:

{
    "apples": "1",
    "bananas": "5"
}