Google App Engine 的网络服务
我看到Google App Engine可以托管返回HTML等内容的网页应用。但是,关于那些通过HTTP进行通信并接受/返回XML的网络服务呢?
有没有人知道在Google App Engine上用Python或者Java是怎么实现这个的?(JAS-WX不支持)如果有相关的链接、示例或者文章,那就太感谢了。
谢谢 // :)
3 个回答
使用谷歌应用引擎(GAE)来托管“通过HTTP通信并接受/返回XML的网络服务”是完全可行的,而且并不太难。
如果你想解析XML请求(通常是通过HTTP的POST或PUT请求发送过来的),你有几种选择,比如使用pyexpat或者在它的基础上使用minidom。你可以参考这个讨论串,特别是里面的最后一条回复。
如果你愿意的话,也可以用minidom来构建XML响应,然后将其写回去(例如,使用一个StringIO
实例来保存格式化后的响应,并把它的write
方法作为参数传给minidom实例的writexml
方法,然后再用这个实例的getvalue
方法获取所需的字符串结果)。虽然你只能使用纯Python和一些“白名单”上的C语言扩展,比如pyexpat,但这并不会大大限制你的选择,也不会让你的工作变得特别困难。
记得把响应的内容类型设置为text/xml
(或者更具体、更合适的媒体类型,如果有的话!)——我建议使用UTF-8(这是标准的文本编码,可以表达所有Unicode字符,同时如果你的数据是纯ASCII的话,它也能兼容!),而不是奇怪的“代码页”或地区限制的编码,比如ISO-8859系列。
大多数Python应用程序只需要写一个处理器,直接输出格式化好的XML。这段代码的例子是用来处理所有发送到根网址(“/”)的GET请求的:
import wsgiref.handlers
from google.appengine.ext import webapp
class MainHandler(webapp.RequestHandler):
def get(self):
self.response.out.write('<myXml><node id=1 /></myXml>')
def main():
application = webapp.WSGIApplication([('/', MainHandler)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
Google App Engine 让你可以编写网络服务,返回任何类型的 HTTP 响应内容。这些内容可以是 xml、json、文本等等。
比如,可以看看 Google 提供的 留言簿示例项目,这个项目展示了 HTTP 响应以 text/plain 格式返回的情况:
public class GuestbookServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
if (user != null) {
resp.setContentType("text/plain");
resp.getWriter().println("Hello, " + user.getNickname());
} else {
resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
}
}
}
此外,app engine google 讨论组 是一个很好的地方,可以了解更多信息、提问以及查看示例代码。