App Engine 应用程序可以与其他应用程序进行通信或通过抓取网址访问网络上的其他资源。这对与网络服务器通讯或检索 RSS 供稿数据非常有用。
urlfetch.fetch() 函数执行 HTTP 请求。
from google.appengine.api import urlfetch url = "http://www.google.com/" result = urlfetch.fetch(url) if result.status_code == 200: doSomethingWithResult(result.content)
fetch() 支持五种 HTTP 方法:GET、POST、HEAD、PUT 和 DELETE。请求可以包含 HTTP 标头和 POST 或 PUT 请求的正文内容。例如,要使用 POST 操作向网络表单处理程序提交数据:
import urllib
form_fields = {
"first_name": "Albert",
"last_name": "Johnson",
"email_address": "Albert.Johnson@example.com"
}
form_data = urllib.urlencode(form_fields)
result = urlfetch.fetch(url=url,
payload=form_data,
method=urlfetch.POST,
headers={'Content-Type': 'application/x-www-form-urlencoded'})
仅限于在访问端口 80 (http) 和端口 443 (https) 中进行网址抓取。不支持其他端口或网址方案。
其他网址抓取操作是同步的:在远程服务器响应之前 fetch() 函数不会返回。
由于应用程序必须在若干秒内响应用户的请求,对较慢的远程服务器的网址抓取操作可能会导致应用程序向用户返回服务器错误。目前没有方法指定网址抓取操作的时间限制。有一种控制较慢的远程服务器的用户体验的方式是:使用浏览器 JavaScript 在您的应用程序(该应用程序执行需要网址抓取的操作)上调用单独的处理程序,然后在处理程序失败的情况下向用户报告错误。
App Engine 使用与 HTTP/1.1 兼容的代理来抓取结果。代理可以提出 HTTPS 请求,但是无法验证与其联系的主机。代理接受所有 SSL 证书,包括自签名证书。
fetch() 可跟随 HTTP 重定向最多 5 次,然后返回最终资源。您可以用参数告知它不跟随重定向。
请求处理程序无法抓取自己的请求的网址。这可以避免意外的无限循环,出现无线循环情况时应用程序会一直调用自己。
当发送 HTTP POST 请求时,如果未明确设置 Content-Type 标头,则标头会被设置为 x-www-form-urlencoded。这是网络表单使用的内容类型。