Go
GAE
golang

golang の anaconda などを GAE 内で利用する時、ネットワークアクセスエラーとなる場合の対処

More than 3 years have passed since last update.

問題:

Google App Engine 内にて、anaconda を用いて外部APIのフェッチなどを行う際、以下のエラーとなります。

http.DefaultTransport and http.DefaultClient are not available in App Engine. See https://developers.google.com/appengine/docs/go/urlfetch/overview

App Engine のインフラでは、専用のフェッチする実装を使う必要があるようです。

解決 (http.Clientの場合)

参考:
https://cloud.google.com/appengine/docs/go/urlfetch/

http.Client の Get などを普通に使う場合は

import (
    "appengine"
    "appengine/urlfetch"
)

c := appengine.NewContext(r)
client := urlfetch.Client(c)
resp, err := client.Get("http://www.google.com/")

解決(外部ライブラリの場合)

でもって、外部ライブラリの場合はライブラリが使っている http.Client.Transport を appengine のものに差し替える必要があります。

tweetlib では以下の例がありますので、
https://robbycolvin.com/google-app-engine-http-default-transport/

コレを参考に

api := anaconda.NewTwitterApi("-", "-")
c := appengine.NewContext(r)
api.HttpClient.Transport = &urlfetch.Transport{Context: c}
searchResult, _ := api.GetSearch("golang", nil)

として、Transport を差し替えればよさそうです。

ライブラリ側で、 Transport や http.Client が露出している必要があり、無理そうだったら Issue やプルリクを投げるのがよさそうです。