mmofacts.com

RESTful Ajax access?

gepostet vor 13 Jahre, 9 Monate von uhrknall

Hallo zusammen,

ich mache mir gerade (mal wieder) gedanken darüber, privat ein browsergame zu erstellen.

Mein momentaner plan sieht vor, möglichst viel mechanik auf den client abzuwälzen, also Javascript, ajax, etc. Serverseitig will ich in Java entwickeln. Habe darüber nachgedacht, die verbindung von JS zu den serverresouren mit dem Jerseyframework zu realisieren (die JAX-RS referenzimplementierung). Den rest würde ich dann mit einfachem JSPs erledigen...Über die security in dem zusammenhang habe ich mir auch schon gedanken gemacht, das sollte auch machbar sein..

Hat jemand schon erfahrung damit gemacht, den RESTful ansatz in dieser art zu integrieren? bin mir momentan einfach nicht sicher, ob das so der beste weg ist...ob es frameworks gibt, die das ganze einfacher machen.

gepostet vor 13 Jahre, 9 Monate von dewarim

Willkommen! Dann fühle ich mich hier zwischen den ganzen PHPlern nicht mehr so allein

REST ... verwende ich bisher nicht, aber wenn's nötig werden sollte, dann bietet Grails auch dafür Unterstützung.

Die Idee, möglichst viel Arbeit auf dem Client erledigen zu lassen, ist erst einmal gut. AJAX macht die Oberfläche des Browserspiels viel schöner in Hinsicht auf das Antwortverhalten und die Dynamik . Es kann aber zwei-drei Probleme mit sich bringen:

  1. nicht alle Clients sind so leistungsfähig, und es soll als Browserspiel ja auch auf einem Atom-Rechner / Ipad laufen. 
  2. "The client is in the hands of the enemy" - alles, aber auch wirklich alles muß der Server prüfen, sonst fährt das erste Skript-Kiddie das Spiel gegen die Wand. Insofern spricht auch etwas dafür, einige Sachen auf dem Server zu lassen, weil es sicherer ist und man dann nicht doppelte Arbeit hat. (Wobei z.B. eine Eingabeprüfung auf dem Client natürlich auch sinnvoll ist, damit der User nicht erst warten muß, bis der Server ihm eine Fehlermeldung schickt.)
  3. JavaScript ist nicht so leicht zu debuggen wie Java. (Kann auch an mir liegen, habe mehr Erfahrung mit Java...) Der IDE-Support ist im Java-Land einfach besser.
gepostet vor 13 Jahre, 9 Monate von MrMaxx

Dann kommt hier mal ein Hinweis auf die Java-Gruppe hier bei GN unter http://galaxynews.de/groups/10_nichts_ist_besser_als_java/forums/

Ansonsten hat dewarim die wichtigsten Einwände schon genannt...

Abgesehen von der Sicherheitsproblematik kann ich dich aus einem einfachen Grund nur davor warnen (Punkt 3 in dewarims post) und das ist die IDE-Unterstützung und das immernoch unkomfortable Debugging. Ich habe bei overwatch jetzt 300kB selbstgeschriebenen JavaScript-Code und es macht einfach keinen Spass mehr. Ich weiss nicht, ob du dich mit GWT auseinander gesetzt hast, aber vielleicht wärst du damit ja auch glücklich.

Mich würde jedenfalls interessieren, wie du den JS-Client schreiben willst. Ganz besonders im Hinblick darauf, dass Browsergames doch meist etliche Daten (z.B. den Authorisationsstatus eines Benutzers) in einer Sesssion ablegen (was mit Jersey als Server nicht mehr drin ist).

Oh...und dann hab ich noch eine Frage...machst du das, weil du denkst, dass das der beste Weg sein könnte, oder um einfach mal was neues zu lernen/auszuprobieren?

So long...

Maxx

gepostet vor 13 Jahre, 9 Monate von uhrknall

Danke erstmal für eure antworten!

Also die security ist sicherlich eine herausforderung, aber auch das ist ein grund, warum ich das so angehen will ; )

Hmm.. über die mangelnde IDE unterstützung habe ich mir noch nciht so gedanken gemacht, das stört mich tatsächlich bei meinen ersten tests jetzt schon. Dinge wie karte, dynamische übersichten, suche, etc würde ich aber dennoch in JS schreiben, da ich denke, dass sich der mehrwert schon lohnt.

Die angesprochene security in JAX-RS ist durchaus ein problem, das aber durchaus lösbar ist. Entweder geht man tatsächlich den weg einer session (kann ja als parameter der resource mitgesendet werden), es gibt aber auch andere methoden, die dem REST prinzip weniger widersprechen.

Original von MrMaxx

Oh...und dann hab ich noch eine Frage...machst du das, weil du denkst, dass das der beste Weg sein könnte, oder um einfach mal was neues zu lernen/auszuprobieren?

ich denke über den ansatz nach, da ich das REST konzept für sehr gut halte; wenig overhead, etc...naja, vllt muss ich mich von dem strikten konzept auch etwas lösen, mit jersey implementieren könnte ich es ja trotzdem.

Also um deine frage zu beantworten: Ich mache es nicht, weil ich es für den besten weg halte, sondern vielmehr, weil es so eine erste idee von mir war (habe sonst schon mit Jersey entwickelt). Wie ja eingangs erwähnt ist es eher die frage nach erfahrungen oder eben auch ideen, wie das ganze besser zu lösen ist. Deshalb sidn alternativansätze und frameworks auch gerne gehört : ). GWT hatte ich mir auch schon einmal angesehn...muss ich vllt nochmal drüber nachdenken...

gepostet vor 13 Jahre, 9 Monate von dewarim

Original von uhrknall

Danke erstmal für eure antworten!

Also die security ist sicherlich eine herausforderung, aber auch das ist ein grund, warum ich das so angehen will ; )

Empfehlung: Spring Security (formerly known as acegi)

In LittleGoblin brauche ich, um einen Request auf angemeldete User zu begrenzen, nur noch eine Annotation (entweder an der Methode oder dem ganzen Controller).

Java:

    @Secured(['ROLE_USER'])
    def learnSkillSet = {
        def pc = fetchPc(session)
// do something with PlayerCharacter ...
}

Das funktioniert auch sehr schön mit AJAX-Requests. (Hier implementiert in Grails mit Security Plugin)

Dinge wie karte, dynamische übersichten, suche, etc würde ich aber dennoch in JS schreiben, da ich denke, dass sich der mehrwert schon lohnt.

Klar, für manche Sachen bietet sich das einfach an. Warum einen TableSort auf dem Server implementieren, um die Gilden nach Namen / Punkten zu sortieren, wenn das auch in einem einfachen (fertigen, Open Source) JavaScript geht.

Also um deine frage zu beantworten: Ich mache es nicht, weil ich es für den besten weg halte, sondern vielmehr, weil es so eine erste idee von mir war (habe sonst schon mit Jersey entwickelt).

Wenn man einen Hammer hat ... :) - aber das geht mir genauso. Immerhin habe ich darauf verzichtet, mein Browserspiel auf der Basis von Perl Regexes zu entwickeln.

gepostet vor 13 Jahre, 9 Monate von uhrknall

danke für den tipp! habe tatsächlich in letzter zeit auch mit spring security gearbeitet. hab das aber bisher für nen overkill gehalten für nen browsergame. aber werde ich dann auch nochmal drüber nachdenken.

Wie verbindest du das ganze denn mit dem ajax request? der ajax request muss ja dann einem principal  / user zugeordnet werden. bzw macht grails das für dich? habe noch nie mit grails gearbeitet.

gepostet vor 13 Jahre, 9 Monate von dewarim

Original von uhrknall

danke für den tipp! habe tatsächlich in letzter zeit auch mit spring security gearbeitet. hab das aber bisher für nen overkill gehalten für nen browsergame. aber werde ich dann auch nochmal drüber nachdenken.

Das ist sinnvoll, zumal z.B. das Security-Plugin auch gleich noch die Login/Logout-Controller erstellt uvam, was dann als gute Vorlage zum customizing dienen kann.

Wie verbindest du das ganze denn mit dem ajax request? der ajax request muss ja dann einem principal  / user zugeordnet werden. bzw macht grails das für dich? habe noch nie mit grails gearbeitet.

Wenn ich in einem Request den User brauche, benutze ich so etwas hier:

Groovy:

    User fetchUser() {
User user = authenticateService.principal().domainClass
user = User.get(user.id) // reload detached user instance
return user
}

 Die Zuordnung ajax <=> session macht Grails / das Plugin, welches auch authenticateService bereitstellt.

Im Prinzip läuft das so ab:

In einer Klasse habe ich:

Groovy:

    @Secured(['ROLE_USER'])
def describe = {
def pc = fetchPc(session)
Guild guild = Guild.get(params.guild)
if(! guild){
return render(status:503, text:message(code:'error.guild.not_found'))
}
return render(template:"/guild/guild_description", model:[guild:guild])
}

Ajax request wird an /guild/describe geschickt.

Grails ordnet das der Methode "describe" im GuildController zu. Wenn es eine Session für diesen User gibt, wird sie gesetzt, ansonsten schlägt der Request fehl [Ajax-Auth ist noch in Arbeit...].

Die Variable params enthält Key-Value-Mappings der übergebenen Parameter (also POST mit guild=id), man greift auf die einzelnen Werte mit params.$parameterName zu.

Wäre dies eine normale HTML-Seite, würde automatisch das template /guild/describe.gsp aufgerufen. Aber in diesem Fall will ich ja nur einen kleinen Snippet senden (oder lediglich die entsprechend der Sprache im Client lokalisierte Fehlermeldung).

Auf dem Client wird dann - je nachdem, ob der Request erfolgreich war, oder upgedated.

Der Code zum Erzeugen des Ajax-Links:

GSP:

    update="[success:'guild_description', failure:'message']" 
params="[guild:guild.id]">

 (remoteLink ist ein Standard-Tag von Grails, das mit diversen JavaScript-Bibliotheken funktioniert).

gepostet vor 13 Jahre, 9 Monate von knalli

Original von uhrknall

danke für den tipp! habe tatsächlich in letzter zeit auch mit spring security gearbeitet. hab das aber bisher für nen overkill gehalten für nen browsergame. aber werde ich dann auch nochmal drüber nachdenken.

Wenn ich überlege, was manche Browsergames sicher für komplexe statische, aber auch dynamische ACL-Strukturen haben, dann ist Spring Security kein Overkill mehr. Ich würde es auch empfehlen, weil es einfach alles abdeckt. Und wenn etwas nicht drin ist, kann man es selber komponenten-orientiert (DI sei Dank auch gut integrierbar) implementieren.

Aber:

  • Für ein einfaches Formular ist es definitiv der Overkill der Overkills. 
  • Spring Security ist einfach nur scheiß komplex (geworden), da hängt man als Neuling nicht nur ein paar Stunden/Tagen drin - es sei denn man tippt das Tutorial ab und hat keine Ahnung, was im Hintergrund läuft bzw. braucht keine Anpassungen (Rollen, Hierarchien, RememberMe-Service, eigene Loginqueries, URL-Patterns...)
  • Es bleibt ein mächtiges Framework: nur sind andere wirklich besser? (wenn ja, welche und wieso?)
  • Man kann nur einen Sicherheitskontext* starten/konfigurieren. Wenn nein, bitte ich um Erklärung ;)

* wenn man in der gleiche App zwei verschiedene Einsprünge machen möchte, bspw. API via BasicAuth und Webfrontend via Loginformular oder Ajax.

gepostet vor 13 Jahre, 9 Monate von uhrknall

dann danke nochmal für eure infos /meinungen. Das mit groovy sieht ja auch recht interessant aus.. ist mir grade aber etwas zu viel, mich in eine neue umgebung reinzuarbeiten.

Ich denke, ich werde jetzt erstmal GWT testen, das sieht mir recht vielversprechend aus. Und ob ich Spring Security dann noch nutze, muss ich mal sehen...

gepostet vor 13 Jahre, 9 Monate von knalli

Original von uhrknall

dann danke nochmal für eure infos /meinungen. Das mit groovy sieht ja auch recht interessant aus.. ist mir grade aber etwas zu viel, mich in eine neue umgebung reinzuarbeiten.

Nun ja, das sieht unter "normal Java" genauso aus. Nur eben in Java-Syntax. Auch dort gibt es Annotationen, DI, usw. ;)

Ich denke, ich werde jetzt erstmal GWT testen, das sieht mir recht vielversprechend aus. Und ob ich Spring Security dann noch nutze, muss ich mal sehen...

Dringend: Schaue dir den Blog von SpringSource an. Du ersparst dir mit Sicherheit Arbeit ;)

gepostet vor 13 Jahre, 9 Monate von uhrknall

Original von knalli

Original von uhrknall

dann danke nochmal für eure infos /meinungen. Das mit groovy sieht ja auch recht interessant aus.. ist mir grade aber etwas zu viel, mich in eine neue umgebung reinzuarbeiten.

Nun ja, das sieht unter "normal Java" genauso aus. Nur eben in Java-Syntax. Auch dort gibt es Annotationen, DI, usw. ;)

ähm.. ja. dessen bin ich mir durchaus bewusst. Wie gesagt habe ich auch schon mit Spring Security etc gearbeitet. ; )

mit "neue umgebung" meine ich entsprechend groovy, i.e die groovy syntax. Habe auch kollegen, die damit arbeiten, mir gefällts aber nicht wahnsinnig...

gepostet vor 13 Jahre, 9 Monate von Todi42

Benutzt jemand von euch GWT? Und wenn ja, wie sind die Erfahrungen so?

gepostet vor 13 Jahre, 9 Monate von MrMaxx

Ich weiss, dass Kingdom of Legends in GWT geschrieben ist. Vielleicht kannst du ja versuchen mit den Entwicklern Kontakt aufzunehmen.Ich kenne einen von ihren Ex-Entwicklern und der wusste hauptsächlich gutes davon zu berichten, besonders nach dem Update auf GWT 2.

Maxx

gepostet vor 13 Jahre, 9 Monate von tkdmatze

Original von Todi42

Benutzt jemand von euch GWT? Und wenn ja, wie sind die Erfahrungen so?

Wir benutzen es sogar auf Arbeit,  Client-Code Testen und Debuggen ist schon ne geile Sache

gepostet vor 13 Jahre, 9 Monate von Sarge

ich nutz es ab und zu für mich selbst und es ist einfach... super :)

gepostet vor 13 Jahre, 9 Monate von Todi42

Na, bei so viel possitivem Feedback, muss ich mir das wohl mal genauer angucken.

Auf diese Diskussion antworten