20.5 使用用户服务和探索其 API

    编辑 helloworld2.go 文件,用以下 Go 代码替换它:

    Listing 20.3 helloworld2_version2.go:

    通过在浏览器中重新加载页面来测试它。你的应用程序会给你一个链接,当你遵循这个链接时,会把你重定向到适合测试你的应用程序的本地版本的谷歌登录页面。你可以在这个页面中输入任何你喜欢的用户名,你的应用程序将看到一个基于该用户名的假的 值。当你的应用程序在 App Engine 上运行时,用户将被引导到 Google 账户的登录页面,然后在成功登录或创建账户后,会被重定向到你的应用程序。

    为了访问这个,我们需要导入一些专门针对 GAE 的 Go 包,即一般的 appengineappengine/user

    在处理程序中,我们首先需要制作一个与当前请求r相关联的Context对象,这在一行中完成:

      appengine.NewContext() 函数在这里返回一个名为 c 的 值:这是 Go App Engine SDK 中许多函数用来与 App Engine 服务通信的值。然后我们从这个上下文中测试是否已经有一个用户在此时登录,方法是:

      1. url, err := user.LoginURL(c, r.URL.String())

      第 2 个参数 是当前请求的 url,这样谷歌账户登录机制可以在成功登录后进行重定向:它将在用户登录或注册新账户后将其送回这里。登录界面的发送是通过设置一个 Location 数据头并返回一个 HTTP 状态代码 302“Found”来完成的。

      LoginURL() 函数返回一个 error 值作为其第二个参数。尽管这里不太可能发生错误,但检查它并在适当的时候向用户显示错误是很好的做法(在这种情况下,用 http.Error helper):

      当用户登录后,我们使用与用户账户相关的名字显示一条个性化的信息: