2016-06-11 8 views
2

FetchUrl/GetURL関数を作成するには適切な方法はありますか?コマンドラインから動作し、URLを取得するカスタム方法でgoogleアプリケーションエンジンから動作します。appengineのクロスプラットフォームgoコード

URLのデータを取得して処理するための基本コードがあります。私は自分のデスクトップ上で使用するコードから呼び出すことができ、コードはアプリエンジンにデプロイすることができます。

うまくいけば、私に知らせて邪悪を明確にしてください。

答えて

2

ローカルマシンとAppEngine環境の両方で動作するコードがある場合は、何もしません。

AppEngine上で別のやり方で行う必要があるか、または異なる必要がある場合は、環境を検出し、さまざまな環境に異なるコードを書き込む必要があります。

この検出とコードの選択は、build constraintsを使用すると最も簡単です。 .goファイルの先頭に特別なコメント行を置くことができ、環境に応じてコンパイルされ、実行されない場合があります。

The Go Blog: The App Engine SDK and workspaces (GOPATH)からの引用:"appengine"

のApp Engine SDKは、新しいビルド制約用語を紹介します。

のファイルは、App Engine SDKによって作成され、goツールでは無視されます。 GOツールは喜んでそれを構築する一方、逆に、

// +build !appengine 

を指定したファイルは、App EngineのSDKによって無視されます。

たとえば、2つの別々の.goファイルをAppEngineとローカル(AppEngine以外の)環境用に作成できます。 (同じパラメータリストを使用して)両方で同じ関数を定義するので、コードがどの環境に構築されていても、関数は1つの宣言を持ちます。それが使用されていない地元のenvの実装におけるので、第二パラメータ(*http.Requestが)のみ(Contextを作成することができるようにするために)AppEngineのために必要であることを

func GetURL(url string, r *http.Request) ([]byte, error) 

注:私たちは、この署名を使用します。 (nilでも可能です)。

標準的な環境とAppEngineの両方で利用可能で、HTTP GET要求を行うために使用できるhttp.Clientタイプを利用することができます。 http.Clientの値はAppEngineで異なる方法で取得できますが、一度値がhttp.Clientになると同じ方法で処理できます。だから我々はhttp.Clientを受け取り、残りをすることができる共通のコードを持つでしょう。あなたが行ってきました

// No build constraint: this is common code 

package mypackage 

import (
    "net/http" 
) 

func GetClient(url string, c *http.Client) ([]byte, error) { 
    // Implementation for both local and AppEngine 
    resp, err := c.Get(url) 
    if err != nil { 
     return nil, err 
    } 
    defer resp.Body.Close() 
    body, err := ioutil.ReadAll(resp.Body) 
    if err != nil { 
     return nil, err 
    } 
    return body, nil 
} 
+0

url_local.go

// +build !appengine package mypackage import ( "net/http" ) func GetURL(url string, r *http.Request) ([]byte, error) { // Local GetURL implementation return GetClient(url, &http.Client{}) } 

url_gae.go

// +build appengine package mypackage import ( "google.golang.org/appengine" "google.golang.org/appengine/urlfetch" "net/http" ) func GetURL(url string, r *http.Request) ([]byte, error) { // Appengine GetURL implementation ctx := appengine.NewContext(r) c := urlfetch.Client(ctx) return GetClient(url, c) } 

url_common.go

実装例は次のようになります。例を含めることによって、その答えについてはそれ以上のものがあります。私は '+ + build'を使用する能力を知らなかった。本当にありがとう。 – Jacob

0

golang/appengineプロジェクト自体にいくつかの手がかりを得ることができます。

たとえば、remote_api/client.goは、ユーザーの運用アプリケーションにリモートで接続するためのクライアントを提供します。

関連する問題