2016-08-09 43 views
0

Wir implementieren WSO2-AM für den Zugriff auf einige interne APIs aus unserem Moodle-LMS, die wir im Internet bereitstellen möchten.WSO2 - API-Manager - Übergeben von Post-Body-Params als URL-Abfragezeichenfolgen an Moodle

Ich konfiguriere den Zugriff auf dieses LMS über WSO2, aber ich bin auf ein Problem gestoßen, das ich nicht lösen kann.

Ich weiß, dass die WSO2-Dokumentation umfangreich ist, aber ich konnte keine spezifische Instanz dieser Konfiguration finden.

Hintergrund: Moodle selbst hat seine APIs in einer sehr nicht standardisierten Art und Weise implementiert. Sie nennen sie RUHE, aber sie sind nicht wirklich erholsam. Einige der Parameter, z. B. ein Benutzer-Token, werden in der URL-Abfragezeichenfolge übergeben, anstatt Header im Hauptteil der Abfrage selbst zu verwenden.

Zunächst habe ich zwei in WSO2 konfigurierte APIs, eine um ein Benutzer-Token von Moodle anzufordern (Moodle erfordert dies, um Zugriff auf die API für einen bestimmten Benutzer zu erlauben) und ein anderes, um die Benutzer eingeschriebenen Kursliste zu erhalten.

Die erste Anforderung, das Benutzer-Token von Moodle über WSO2 zu erhalten, verläuft wie erwartet. Ich übergebe die Benutzernamen/Passwort/Service-Parameter über den Header wie Sie erwarten (so dass sie über HTTPS verschlüsselt sind) an WSO2, die es als POST an Moodle schiebt. Die Antwort von Moodle über WSO2 ist wie erwartet eine JSON-Nutzlast, die ein Token enthält, das mein Client dann analysiert, um es in nachfolgenden Anfragen zu verwenden.

Die nächste Anfrage ruft dann einen nützlicheren Dienst in Moodle auf, um einen Benutzer immatrikulierte Kurse zu erhalten. Es gibt zwei Probleme, die hier erwähnt werden, von denen ich nicht weiß, wie ich sie lösen soll.

Die Probleme: Moodle erwartet GET oder POST-Parameter für den Aufruf an den Web-Service. Wenn ich GET verwende, was praktisch zum Testen ist, sind die Parameter, die vom Client an WSO2 übergeben werden, entweder falsch (im Falle der 'Benutzer-ID') oder fehlen (im Fall des Wstoken-Feldes, das im Post ist) Karosserie).

In API Verlag I die API in WSO2 haben konfiguriert für POST mit einer URL Muster {version}/Kurs/{userid} Die API-Definition ist so konfiguriert, wie unten: API Definition

API Endpoint Konfiguration ist: API Endpoint Configuration

URL: http://(moodleurl)/webservice/rest/server.php?wstoken= {uri.var.wstoken} & wsfunction = core_enrol_get_users_courses & moodlewsrestformat = json & Benutzer-ID = {} uri.var.userid

URL abholen, wie sie von Apache hosting Moodle empfangen wird: xx.xx.xx.xx - - [09/Aug. 2016: 10: 36: 03 +0930] "POST /webservice/rest/server.php?wstoken = & wsfunction = core_enrol_get_users_courses & moodlewsrestformat = json & userid = 06.06 HTTP/1.1" 200 270

So sind die beiden Fragen sind die fehlenden 'wstoken' Parameter (die in der Post Körper WSO2 vorgesehen ist, und die 'userid' wird mit einem Schrägstrich zwischen den Elementen verdoppelt.

Ich habe den Client über einen Proxy und die Daten werden korrekt ausgeführt zu WSO2 gesendet werden: Client->WSO2 Proxy

Also, was ich frage mich, über diese Probleme tun können:

Gibt es eine andere URL-Parameter, den ich verwenden kann, um einen geposteten Body-Parameter in der URL korrekt in die Service-API-Adresse aufzunehmen?

Gibt es ein spezifisches Konfigurationsproblem, das den Userid-Parameter auf diese Weise zum Brechen gebracht hat?

Die geposteten Parameter vom Client scheinen im Beitrag von WSO2 zu Moodle enthalten zu sein; Es ist also wahrscheinlich, dass sie aus der URL entfernt werden können und einfach von WSO2 in den Post-Body nach Moodle eingefügt werden, was bedeutet, dass wahrscheinlich nur das Problem mit dem Benutzer-ID-Parameter gelöst werden muss - leider nicht Sicher, wie man einen Proxy zwischen WSO2 und Moodle selbst platziert, um die Parameter zu validieren, die an die API gesendet werden, kurz bevor Wireshark verwendet wird.

Antwort

1

Die 'Benutzer-ID' wird mit einem Schrägstrich zwischen den Elementen verdoppelt, da die URI-Vorlage der API-Ressource zur Laufzeit automatisch an das Ende des HTTP-Endpunkts angehängt wird. Ein Beispiel für die in Ihrem Fall definieren Sie die Endpunkt-URL wie:

http://(moodleurl)/webservice/rest/server.php?wstoken={uri.var.wstoken}&wsfunction=core_enrol_get_users_courses&moodlewsrestformat=json&userid={uri.var.userid}

Dann URL-Muster (/{userid}) anhängt an die Endpunkt-URL standardmäßig. Um dieses Problem zu überwinden, können Sie die folgende Mediator Einstellung verwenden, um die URL Postfix aus dem Backend-Endpunkt zu entfernen:

<property name="REST_URL_POSTFIX" scope="axis2" action="remove"/>

Mehr zu diesem Link finden Sie in [1].

Sie können die Variablen in den Ressourcen (URLs) während der Laufzeit der Vermittlung mithilfe von Eigenschaftswerten mit "uri.var" lesen. Präfix. Zum Beispiel erhält der HTTP-Endpunkt in Ihrem Fall die wstoken und Benutzer-ID als die uri-Variablen. Aber wstoken enthält im Hauptteil der Anfrage. Daher können Sie es nicht hinzufügen, indem Sie wstoken = {uri.var.wstoken} als Abfrageparameter für den Endpunkt eingeben. Eine Möglichkeit, dieses Problem zu beheben, besteht darin, wstoken als Abfrageparameter zu definieren, indem Sie den Parameter Parameter in query ändern. Die andere Möglichkeit besteht darin, sie in der Kopfzeile der eingehenden Anfrage zu definieren.

[1]. https://docs.wso2.com/display/AM190/Map+the+Parameters+of+your+Backend+URLs+with+the+API+Publisher+URLs

+0

Leider scheint das nicht geholfen zu haben. Ich habe die Richtlinie für Nachrichtenvermittlung, wie auf der verknüpften Seite beschrieben, in die Mediation-Richtlinie "in" eingefügt, scheint jedoch nicht hilfreich zu sein. Zusätzlich habe ich den Endpunkt geändert und die Benutzer-ID-Option als ein Beispiel entfernt, aber dies wurde nicht in den zukünftigen Aufrufen angezeigt. Ich war sicher, die Änderung "zu speichern und zu veröffentlichen", aber ohne Erfolg. Ich habe auch einen Screenshot gemacht, aber ich kann nicht scheinen, es in einen Kommentar hochzuladen. – vortex

+0

Haben Sie den Parametertyp von wstoken in den Abfrageparametertyp geändert? Sie können Screenshots an die Frage anhängen. Bitte aktualisiere es mit den neuen Screenshots. –

+0

Ich habe den Parameter wstoken in Abfrage geändert, jedoch gab es zunächst keine Auswirkungen, da Änderungen aus irgendeinem Grund nicht berücksichtigt wurden. Ich habe es am Ende zu arbeiten, obwohl - ich musste den gesamten API-Endpunkt zu löschen, dann neu erstellen, da die Änderung der Parameter-Typen und Endpunkt-Parameter aus irgendeinem Grund nicht funktionierte. – vortex