【问题标题】: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。