【问题标题】:Web Services with Google App Engine使用 Google App Engine 的网络服务
【发布时间】:2009-07-28 18:31:01
【问题描述】:

我看到 Google App Engine 可以托管将返回 html 等的 Web 应用程序。但是通过 http 进行通信并接受/返回 xml 的 Web 服务呢?

有谁知道在 Goggle App Engine 中使用 Python 或在 Java 中如何完成此操作(不支持 JAS-WX)?非常感谢任何示例或文章的链接。

谢谢 // :)

【问题讨论】:

    标签: java python web-services google-app-engine


    【解决方案1】:

    Google App Engine 允许您编写返回任何类型的 HTTP 响应内容的网络服务。这包括xml、json、文本等。

    例如,看看 Google 提供的 guestbook sample project,它显示 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 group 是了解更多信息、提出问题和查看示例代码的好地方。

    【讨论】:

      【解决方案2】:

      大多数 python 应用程序只是编写一个直接输出成形 xml 的处理程序...此示例服务于提交到根 url ("/") 的任何 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()
      

      【讨论】:

        【解决方案3】:

        使用 GAE 托管“通过 http 通信并接受/返回 xml 的 Web 服务”绝对是可能的(而且不太难)。

        要解析 XML 请求(可能是作为 HTTP POST 或 PUT 请求的主体),您有几个选项,例如pyexpat 或 minidom 位于其之上,例如参见 this thread(尤其是关于它的最后一篇文章)。

        如果您愿意,您还可以使用 minidom 来构造 XML 响应并返回 write(例如,使用 StringIO 实例来保存格式化的响应,并将其 write 方法作为 minidom 实例 @ 的参数987654325@ 方法,然后转身并使用该实例的getvalue 以字符串形式获得所需的结果)。即使您仅限于纯 Python 和一些“列入白名单”的 C 编码扩展(例如 pyexpat),但这并不会真正限制您的选择,也不会让您的生活变得更加艰难。

        请记住将您的响应的内容类型标头设置为text/xml(或者一些更具体和更合适的媒体类型,如果有的话,当然!)——并且,我建议使用 UTF-8(标准文本编码,如果您的数据恰好是纯 ASCII!-),而不是奇怪的“代码页”或诸如 ISO-8859 系列之类的区域限制代码,则可以让您在纯 ASCII 的同时表达所有 Unicode。

        【讨论】:

          猜你喜欢
          • 2011-02-15
          • 2017-11-12
          • 2013-10-31
          • 1970-01-01
          • 2012-10-11
          • 1970-01-01
          • 1970-01-01
          • 2010-12-13
          • 2010-09-27
          相关资源
          最近更新 更多