Oto jak wdrożyliśmy Ajax w Google App Engine, ale pomysł można uogólnić na inne platformy.
Mamy skrypt obsługi dla żądań Ajax, który odpowiada - na pewno - z odpowiedziami JSON. Struktura wygląda mniej więcej tak (jest to fragment standardowego skryptu handler GAE):
def Get(self, user):
self.handleRequest()
def Post(self, user):
self.handleRequest()
def handleRequest(self):
'''
A dictionary that maps an operation name to a command.
aka: a dispatcher map.
'''
operationMap = {'getfriends': [GetFriendsCommand],
'requestfriend': [RequestFriendCommand, [self.request.get('id')]],
'confirmfriend': [ConfirmFriendCommand, [self.request.get('id')]],
'ignorefriendrequest': [IgnoreFriendRequestCommand, [self.request.get('id')]],
'deletefriend': [DeleteFriendCommand, [self.request.get('id')]]}
# Delegate the request to the matching command class here.
Polecenia są proste wdrożenie wzoru polecenia:
class Command():
""" A simple command pattern.
"""
_valid = False
def validate(self):
""" Validates input. Sanitize user input here.
"""
self._valid = True
def _do_execute(self):
""" Executes the command.
Override this in subclasses.
"""
pass
@property
def valid(self):
return self._valid
def execute(self):
""" Override _do_execute rather than this.
"""
try:
self.validate()
except:
raise
return self._do_execute()
# Make it easy to invoke commands:
# So command() is equivalent to command.execute()
__call__ = execute
Po stronie klienta, możemy utwórz delegata Ajax. Prototype.js ułatwia to pisanie i zrozumienie. Oto fragment:
/**
* Ajax API
*
* You should create a new instance for every call.
*/
var AjaxAPI = Class.create({
/* Service URL */
url: HOME_PATH+"ajax/",
/* Function to call on results */
resultCallback: null,
/* Function to call on faults. Implementation not shown */
faultCallback: null,
/* Constructor/Initializer */
initialize: function(resultCallback, faultCallback){
this.resultCallback = resultCallback;
this.faultCallback = faultCallback;
},
requestFriend: function(friendId){
return new Ajax.Request(this.url + '?op=requestFriend',
{method: 'post',
parameters: {'id': friendId},
onComplete: this.resultCallback
});
},
getFriends: function(){
return new Ajax.Request(this.url + '?op=getfriends',
{method: 'get',
onComplete: this.resultCallback
});
}
});
zadzwonić delegata, można zrobić coś takiego:
new AjaxApi(resultHandlerFunction, faultHandlerFunction).getFriends()
Mam nadzieję, że to pomoże!
http://code.google.com/webtoolkit/doc/latest/tutorial/appengine.html <- Najnowsze położenie powyższego podręcznika. Chciałbym mieć przedstawiciela do edycji. ;) – Drew
@Drew - Zaktualizowano adres URL w odpowiedzi. Dzięki za heads up. –
Dzięki Dave. Ach, przypuszczam, że to wyklucza możliwość używania Google Web Toolkit jako ramy AJAX dla GAE. Szkoda! Czy istnieją inne ramy? – Graviton