Note: This is a follow-up of a previous post Locally modifying Go package. As today (May 17, 2014) the changes described there are neccessary for a below code work.
We will modify: datastore_info.go provided as example of remote_api usage in App Engine Go SDK. One should follow the steps in Go SDK doc on remote_api to enable it.
Local client
The trivial function to sign in in a dev server as an admin is below.
func clientLocalLoginClient(host, email string) *http.Client {
 jar, err := cookiejar.New(nil)
 if err != nil {
  log.Fatalf("failed to make cookie jar: %v", err)
 }
 client := &http.Client{
  Jar: jar,
 }
 local_login_url := fmt.Sprintf("http://%s/_ah/login?email=%s&admin=True&action=Login&continue=", host, email)
 resp, err := client.Get(local_login_url)
 if err != nil {
  log.Fatalf("could not post login: %v", err)
 }
 defer resp.Body.Close()
 body, err := ioutil.ReadAll(resp.Body)
 if resp.StatusCode != http.StatusOK {
  log.Fatalf("unsuccessful request: status %d; body %q", resp.StatusCode, body)
 }
 if err != nil {
  log.Fatalf("unable to read response: %v", err)
 }
 m := regexp.MustCompile(`Logged in`).FindSubmatch(body)
 if m == nil {
  log.Fatalf("no auth code in response %q", body)
 }
 return client
}
Connecting to localhost instead a real app requires modifying a main to use the clientLocalLoginClient function if host address points to localhost:
 is_local := regexp.MustCompile(`.*(localhost|127\.0\.0\.1)`).MatchString(*host)
 if !is_local && *passwordFile == "" {
  log.Fatalf("Required flag: -password_file")
 }
 var client *http.Client
 if !is_local {
  p, err := ioutil.ReadFile(*passwordFile)
  if err != nil {
   log.Fatalf("Unable to read password from %q: %v", *passwordFile, err)
  }
  password := strings.TrimSpace(string(p))
  client = clientLoginClient(*host, *email, password)
 } else {
  client = clientLocalLoginClient(*host, *email)
 }
The full source code can be found here: https://gist.github.com/orian/3f74c6add4e4f572e108
The above code can be invoked as follow:
$ goapp run datastore_stats.go -host=localhost:8080 -email=test@example.com
Exporting data to sample app
Sample application with enabled remote_api in Go and data exporter can be found on GitHub github.com/orian/gae-go-remote-api-example.
The prerequirement is a configured Google App Engine Go SDK.
Getting and starting the app:
cd workspace/go git clone git@github.com:orian/gae-go-remote-api-example.git cd gae-go-remote-api-example goapp serverThis starts app and logs 3 crucial info:
INFO 2014-05-17 21:30:27,120 api_server.py:171] Starting API server at: http://localhost:55542 INFO 2014-05-17 21:30:27,132 dispatcher.py:182] Starting module "default" running at: http://localhost:8080 INFO 2014-05-17 21:30:27,133 admin_server.py:117] Starting admin server at: http://localhost:8000In another terminal one can:
cd workspace/go/gae-go-remote-api-example/examples goapp run export_data.go --data_dir data/ -host localhost:8080 -email test@test.comThe terminal output should look similar to:
2014/05/17 23:47:07 appengine: not running under devappserver2; using some default configuration 2014/05/17 23:47:07 App ID "gae-go-boilerplate" Skip: Visited: data/data_item_0.json Visited: data/data_item_1.json filepath.Walk() returnedThis means that data from files# ironically this is good 
data_item_0.json and data_item_1.json has been opened successfully and exported. One can check on admin panel of dev server:
http://localhost:8000/datastore?kind=DataItem