Foren

Remote-Zugriff einer ServiceUtil-Klasse

Jan Krueger, geändert vor 10 Jahren.

Remote-Zugriff einer ServiceUtil-Klasse

New Member Beiträge: 9 Beitrittsdatum: 12.10.12 Neueste Beiträge
Hi Gurus,
die JavaDocs der ServiceUtil-Klassen sagen:
This is a remote service. Methods of this service are expected to have security checks based on the propagated JAAS credentials because this service can be accessed remotely.
Wie kann ich z.B. JournalArticleServiceUtil remote aufrufen?

Hier https://www.liferay.com/de/documentation/liferay-portal/6.1/development/-/ai/invoking-the-api-remotely ist das grundsätzlich beschrieben.
Note too, if you want to use the API through Remote Procedure Calls (RPC), you can do so.
Aber wie ist das konkret zu implementieren?

An welcher Stelle definiere ich das Remote-System? Nach meinem Verständnis muss ich einen PermisseionChecker instanziieren. Hierzu steht PermissionCheckerFactoryUtil zur Verfügung. Wie definiere ich allerdings das Remote-System?

Einige Methoden von JournalArticleServiceUtil besitzen das Attribut ServiceContext. In diesem kann man PortalUrl, RemoteHost oder RemoteAddr setzen. Allerdings hat das keine Auswirkungen.

Liferay stellt eine Client-Library unter http://www.liferay.com/downloads/liferay-portal/additional-files zur Verfügung. Allerdings beinhaltet diese Library nur Soap-Clients. Gibt es einen RPC/RMI-Client?

Kann mir jemand ein Coding-Beispiel zur Verfügung stellen?

Vielen Dank
Jan Krüger
thumbnail
Stefan Brötz, geändert vor 10 Jahren.

RE: Remote-Zugriff einer ServiceUtil-Klasse

Junior Member Beiträge: 76 Beitrittsdatum: 01.02.10 Neueste Beiträge
Hmm, was hast Du genau vor?

Willst Du (nur) von Javascript-Code aus auf eine Methode des JournalArticleService zugreifen? Dann rufe in Deinem Portal mal die URL http://localhost:8080/api/jsonws auf. Links findest Du alle Methoden (gruppiert nach Services), die remote aufgerufen werden können. Klicke auf einen Methodennamen und Du siehst die Signatur der Methode. Gleichzeitig kannst Du von dieser Stelle aus die Methode aufrufen.

Dort angekommen kannst Du Dir im HTML-Quelltext angucken, wie der Methodenaufruf realisiert ist. Ansonsten ist die Beschreibung in https://www.liferay.com/de/documentation/liferay-portal/6.1/development/-/ai/json-web-services lesenswert, wobei Du hier ein bisschen selektiv lesen musst: Der Client-seitige Teil ist sehr stark verwoben mit dem Server-seitigen Anteil.

Gruß, Stefan.
Jan Krueger, geändert vor 10 Jahren.

RE: Remote-Zugriff einer ServiceUtil-Klasse

New Member Beiträge: 9 Beitrittsdatum: 12.10.12 Neueste Beiträge
Hallo Stefan,
vielen Dank für Deine Antwort!
Ich möchte nicht via Web-Service sonder via RPC einen Server aufrufen. Das RPC API bietet andere und "mächtigere" Methoden an. Allerdings ist mir bis heute nicht ganz klar, wie dieser RPC-Call funktionieren kann.
Das Ganze ist ja bereits ein paar Wochen her und ich habe mir mittlerweile mit eigenen Web-Services beholfen.
Gruß
jan
thumbnail
Stefan Brötz, geändert vor 10 Jahren.

RE: Remote-Zugriff einer ServiceUtil-Klasse

Junior Member Beiträge: 76 Beitrittsdatum: 01.02.10 Neueste Beiträge
Hallo Jan,
Jan Krueger:
Ich möchte nicht via Web-Service sonder via RPC einen Server aufrufen. Das RPC API bietet andere und "mächtigere" Methoden an. Allerdings ist mir bis heute nicht ganz klar, wie dieser RPC-Call funktionieren kann.

Aha. Und welches Protokoll soll bei Deinem RPC verwendet werden? Außer diversen HTTP-Varianten (XML over HTTP, JSON over HTTP, SOAP over HTTP) und eventuell irgendwelchen MessageBus-Techniken ist mir gerade nichts geläufig, womit man sonst RPC umsetzen könnte.

Welche Variante man auch immer einsetzt, immer ist der zugehörige Endpunkt der zugehörige Remote-Service. Dass man auf anderem Wege an mächtigere Methoden kommen soll, kann und will ich mir gerade nicht so ganz vorstellen: Sollte das heißen, ich könnte von irgendwoher meine LocalServices aufrufen, die eigentlich nur von "trusted code" aus erreichbar sein soll(t)en?

:kopfkratz:

Gruß, Stefan.
Jan Krueger, geändert vor 10 Jahren.

RE: Remote-Zugriff einer ServiceUtil-Klasse

New Member Beiträge: 9 Beitrittsdatum: 12.10.12 Neueste Beiträge
Hallo Stefan,
vielen Dank für Dein Feedback!
Unter http://cdn.docs.liferay.com/portal/6.1/javadocs/com/liferay/portlet/journal/service/JournalArticleServiceUtil.html findest Du die folgenden Dokumentation:
This is a remote service. Methods of this service are expected to have security checks based on the propagated JAAS credentials because this service can be accessed remotely.
Ich habe mich einfach gefragt, wie ich z.B. die Methode addArticle(...) verwende. An welcher Stelle übergebe ich die JAAS credentials? Wie funktioniert das im Detail? Und wenn das ein remote service ist, wie definiere ich das Zielsystem?
Gruß
jan
thumbnail
Stefan Brötz, geändert vor 10 Jahren.

RE: Remote-Zugriff einer ServiceUtil-Klasse

Junior Member Beiträge: 76 Beitrittsdatum: 01.02.10 Neueste Beiträge
Hallo Jan.

Jan Krueger:
Ich habe mich einfach gefragt, wie ich z.B. die Methode addArticle(...) verwende.


Liferay bindet eine JavaScript-Datei namens service.js(?) ein, eventuell passiert das auch über den Minifier, so dass Du sie nicht direkt siehst. Notfalls musst Du sie selbst z.B. in Dein Theme einbauen.

Wenn Du das gemacht hast, dann steht Dir die JSON-Service-API im JavaScript-Namespace zur Verfügung. Details siehe dort: https://www.liferay.com/community/wiki/-/wiki/Main/JSON+Service+API#section-JSON+Service+API-Invoking+the+JSON+API

Du kennst die URL http://localhost:8080/api/jsonws/? Ruf sie mal auf und finde viele Beispiele, Dokumentation aller verfügbaren Services und direkte Aufrufmöglichkeiten.

Jan Krueger:
An welcher Stelle übergebe ich die JAAS credentials? Wie funktioniert das im Detail?


Eigentlich musst Du gar nichts übergeben, das macht das Framework für Dich. Sprich: Wenn Du als Nutzer angemeldet bist, dann werden diese Nutzer-Credentials automatisch übergeben. Wenn niemand angemeldet ist, gibt's entweder 'ne Exception oder Du wirst per HTTP-Basic-Authentication (Browser-Popup) zur Authentifizierung aufgefordert.

Technisch sind dafür das JSONServlet und das JSONWebServiceServlet verantwortlich.

Jan Krueger:
Und wenn das ein remote service ist, wie definiere ich das Zielsystem?


Das Zielsystem ist das Liferay, auf dem der Remote-Service läuft. Die JSON-Service-API wird ja über eine URL aufgerufen, z.B. http://<server-name>:<port>/api/jsonws/... Server-Name und Port legen das Liferay fest, auf dem die Services aufgerufen werden (lies: in dem Du z.B. JournalArticles angelen möchtest).

Gruß, Stefan.
thumbnail
Jan Geißler, geändert vor 10 Jahren.

RE: Remote-Zugriff einer ServiceUtil-Klasse

Liferay Master Beiträge: 735 Beitrittsdatum: 05.07.11 Neueste Beiträge
Doofe Frage Namensvetter, aber was genau willst du eigentlich machen?

Das hab ich noch nicht gelesen, und da ich nicht genau weiss was du machen willst fällt es schwer eine Antwort zu geben ;)

Willst du eine Native Mobile App bauen, wo du über RemoteService Calls deine Daten einsammelst?
Willst du Via Ajax deine Webseite dynamischer gestalten?
Willst du daten aus Liferay in ein anderes System übernehmen?

So viele Sachen die man machen kann....

So long!

Jan
Jan Krueger, geändert vor 10 Jahren.

RE: Remote-Zugriff einer ServiceUtil-Klasse

New Member Beiträge: 9 Beitrittsdatum: 12.10.12 Neueste Beiträge
Hallo und vielen Dank für Deinen Input.
Das ist ja schon eine Weile her... und ich habe das bereits anders gelöst.
Ich wollte z.B. aus einem Java Job heraus das besagte API - den "remote service" - aufrufen.
Der Job sollte z.B. in einer eigenen JVM laufen oder in einer anderen Liferay-Instanz.
Gruß
jan
thumbnail
Christian P. Lerch, geändert vor 10 Jahren.

RE: Remote-Zugriff einer ServiceUtil-Klasse

New Member Beiträge: 18 Beitrittsdatum: 22.06.12 Neueste Beiträge
Hallo Jan,
vor einiger Zeit habe ich mich das auch alles in Zuge eines Projekts gefragt, in dem es darum ging, von einem externen Java-Prozess aus Dateien aus Liferay herauszuholen und wieder zurückzuspeichern.
Nach einigen frustrierenden Recherchen - weil dokumentiert darüber ist wirklich absolut nichts (oder ich hab das alles übersehen emoticon), und aufwendiger, tiefer gehender Code-Analyse musste ich leider feststellen, dass keine der Liferay Remote APIs - also weder SOAP, noch JSON, noch RPC-over-HTTP (ja, die gibt's tatsächlich auch noch) das Arbeiten mit dem Content von FileEntries über eine Remote-Verbindung unterstützt. Eigentlich krass.
Da ich die Funktionalität aber dringend brauchte, hab ich eine standalone Java SE 7 Library implementiert, die das nunmehr leistet und ganz ohne Portal Infrastruktur auskommt. Leider kommt man dabei z.Z. für den File-Download noch nicht um eine kleine Ergänzung im portal-service Code herum, aber immerhin kann ich jetzt von einer anderen Maschine aus mit einer kohärenten API Liferay Dateien bearbeiten.
Falls das für Dich (oder andere) in Zukunft interessant sein sollte:
SourceCode + Binaries + Kurzbeschreibung findest Du hier zum download.
Für etwaige Fragen dazu stehe ich natürlich gerne zur Verfügung. Kommentare, Anregungen oder Kritik dazu sind auch sehr Willkommen.

Gruß,
Christian
thumbnail
Christian P. Lerch, geändert vor 10 Jahren.

RE: Remote-Zugriff einer ServiceUtil-Klasse

New Member Beiträge: 18 Beitrittsdatum: 22.06.12 Neueste Beiträge
Die Frage von Jan

Ich möchte nicht via Web-Service sonder via RPC einen Server aufrufen. Das RPC API bietet andere und "mächtigere" Methoden an. Allerdings ist mir bis heute nicht ganz klar, wie dieser RPC-Call funktionieren kann.


ist sehr berechtigt. Steht doch in Invoking the API Remotely tatsächlich ein winzig-kleiner Hinweis: "You can also use the API through Remote Procedure Calls (RPC)." Der einzige Hinweis auf RPC in der ganzen Liferay Dokumentation übrigens.

Tatsächlich gibt es nun im portal-impl.jar im package com.liferay.service.http die Klassen xyzServiceHttp, welche ganz im Gegensatz zu den SOAP und JSON Webservices, auf vollkommen andere Weise mit den Liferay Services kommunizieren, nämlich durch (binäre) Java-Serialisierung von Methoden-Aufrufen und Tunneling derselben via HTTP Connection an das TunnelServlet. Dieses deserialisiert am Portal dann den remote Method-Call und führt ihn gegen die Liferay Service API aus. Etwaige Rückgabewerte werden wieder serialisiert und an den Caller über die HTTP-Connection zurück gesendet. Das Ganze sieht von außen betrachtet wie Java RMI aus, verwendet dafür aber nicht das standardisiert Java Remote Method Protocol JRMP, sondern offenbar eine proprietäre, aber sehr effiziente Variante davon.

Vorteile gegenüber SOAP und JSON Webservices sind 1. bessere Performance, weil die Serialisierung in Textformat vermieden wird, und 2. umfassendere APIs, weil über SOAP und JSON ist ja nur ein Subset der verfügbaren Liferay Portal und Portlet Services erreichbar.

Nachteile: Nur von Java Code aus nutzbar und, da im portal-impl.jar "mitgeliefert", nur zur Inter-Portal Kommunikation, nicht aber für Standalone-Betrieb (ohne Application Server) vorgesehen.

Den letzteren Nachteil habe ich nun versucht mit einer Standalone-Implementierung (siehe hier) zu eliminieren und bereits in einem Projekt erfolgreich einsetzen können.

Gruß,
Christian
Jan Krueger, geändert vor 10 Jahren.

RE: Remote-Zugriff einer ServiceUtil-Klasse

New Member Beiträge: 9 Beitrittsdatum: 12.10.12 Neueste Beiträge
Hallo Christian,

vielen Dank für Deinen Input! Endlich versteht mich hier einer... ;-)
Vielen Dank auch für Deinen Sourcen. Ich werde mir das bei Gelegenheit mal ansehen.

Gruß
jan

Entschulige bitte meine späte Reaktion die aufgrund von Projektstress und Urlaub erst jetzt erfolgt.
thumbnail
Christian P. Lerch, geändert vor 10 Jahren.

RE: Remote-Zugriff einer ServiceUtil-Klasse

New Member Beiträge: 18 Beitrittsdatum: 22.06.12 Neueste Beiträge
Hallo Jan,

freut mich!
Die Doku ist leider noch etwas dürftig, ich hab aber vor, das bei Gelegenheit nachzuholen emoticon
Solltest Du vorher Fragen zur Anwendung der Library haben, kannst Du mich hier direkt erreichen.

Beste Grüße,
Christian