Вот как мы реализовали Ajax в Google App Engine, но эту идею можно обобщить на другие платформы.
У нас есть сценарий обработчика для запросов Ajax, который реагирует почти - с ответами JSON. Структура выглядит примерно так (это отрывок из стандартного сценария обработчика 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.
Команды представляют собой простую реализацию шаблона команды:
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
На стороне клиента, мы создайте делегат Ajax. Prototype.js позволяет легко писать и понимать. Вот отрывок:
/**
* 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
});
}
});
вызывать делегат, вы сделать что-то вроде:
new AjaxApi(resultHandlerFunction, faultHandlerFunction).getFriends()
Я надеюсь, что это помогает!
http://code.google.com/webtoolkit/doc/latest/tutorial/appengine.html <- Новое место в приведенном выше учебнике. Жаль, что у меня не было репутации, чтобы отредактировать его. ;) – Drew 2010-01-04 22:34:12
@Drew - обновил URL-адрес в ответе. Спасибо за головы. – 2010-01-05 05:03:23