2017-01-22 15 views
0

http.Clientをサポートしていないため、appengineでHTTPリクエストを発行する際に問題があります。私はスラックボットを作成しており、遅れたレスポンスを作りたいと思っています。ロジックは、スラックのPOST要求を受信すると、正常に応答し、外部APIを呼び出すgoroutineを回転させ、終了した後、新たなリクエストを作成します。Googleのアプリケーションエンジンで外部HTTPリクエストを送信する方法

簡単に十分なようだが、AppEngineののurlfetchNewContextを使用しているときNewContext引数として* http.Requestにかかりますが、私は最初のたるみ要求に即座に対応していますから、レスポンスボディを閉じたので、私は遭遇した問題は、あります私はそれを使用して外部APIへの応答を発行することができます。代わりがありますか?

コード:

func Twit(w http.ResponseWriter, r *http.Request) { 
    defaultResponse := &SlashResponse{ResponseType: "ephemeral", Text: "success"} 

    // prepare to make a slack delayed response 
    responseURL := r.FormValue("response_url") 
    go sendDelayResponse(responseURL, r) 

    w.Header().Set("Content-Type", "application/json") 
    w.WriteHeader(200) 
    json.NewEncoder(w).Encode(defaultResponse) 
} 

func sendDelayResponse(url string, r *http.Request) { 
    response := &SlashResponse{ResponseType: "in_channel", Text: twit.TweetTCL(r)} 
    b, _ := json.Marshal(response) 

    // send request to slack using given response_url 
    ctx := appengine.NewContext(r) 
    client := urlfetch.Client(ctx) 
    req, _ := http.NewRequest("POST", url, bytes.NewBuffer(b)) 
    req.Header.Add("Content-Type", "application/json") 
    resp, err := client.Do(req) 
    defer resp.Body.Close() 

    if err != nil { 
     log.Println(err) 
    } else { 
     log.Println("success") 
    } 
} 

答えて

0

要求の範囲外の機能を実行するdelayパッケージを使用。

下位レベルのtaskqueueパッケージを使用することもできます。遅延パッケージは、タスクキューパッケージの上にあります。

遅延機能付き宣言パッケージレベルの変数:

laterfunc.Call(appengine.NewContext(r), responseURL) 
+0

別のAPIを呼び出すときに、この作業はウィル:

var laterFunc("dr", func(ctx context.Context, url string) { response := &SlashResponse{ResponseType: "in_channel", Text: twit.TweetTCL(r)} b, _ := json.Marshal(response) // send request to slack using given response_url client := urlfetch.Client(ctx) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(b)) req.Header.Add("Content-Type", "application/json") resp, err := client.Do(req) defer resp.Body.Close() if err != nil { log.Println(err) } else { log.Println("success") } }) 

はこのようにそれを呼び出しますか?私の問題は、* http.Readerが早期に閉鎖されていることです。 – Finks

+0

すべてのappengine APIは遅延関数から呼び出すことができます。質問のゴルーチンは、要求を使用してコンテキストを作成するだけです。遅延機能パッケージは自動的にコンテキストを作成します。 –

+0

どうか私に例を教えてもらえますか? – Finks

関連する問題