Google App Engine 的网络服务

6 投票
3 回答
3762 浏览
提问于 2025-04-15 13:13

我看到Google App Engine可以托管返回HTML等内容的网页应用。但是,关于那些通过HTTP进行通信并接受/返回XML的网络服务呢?

有没有人知道在Google App Engine上用Python或者Java是怎么实现这个的?(JAS-WX不支持)如果有相关的链接、示例或者文章,那就太感谢了。

谢谢 // :)

3 个回答

2

使用谷歌应用引擎(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系列。

3

大多数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()
9

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 讨论组 是一个很好的地方,可以了解更多信息、提问以及查看示例代码。

撰写回答