LoginSignup
17
13

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-11-27

問題:

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 やプルリクを投げるのがよさそうです。

17
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
13