http.Client
をサポートしていないため、appengineでHTTPリクエストを発行する際に問題があります。私はスラックボットを作成しており、遅れたレスポンスを作りたいと思っています。ロジックは、スラックのPOST要求を受信すると、正常に応答し、外部APIを呼び出すgoroutineを回転させ、終了した後、新たなリクエストを作成します。Googleのアプリケーションエンジンで外部HTTPリクエストを送信する方法
簡単に十分なようだが、AppEngineののurlfetch
とNewContext
を使用しているとき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")
}
}
別のAPIを呼び出すときに、この作業はウィル:
はこのようにそれを呼び出しますか?私の問題は、* http.Readerが早期に閉鎖されていることです。 – Finks
すべてのappengine APIは遅延関数から呼び出すことができます。質問のゴルーチンは、要求を使用してコンテキストを作成するだけです。遅延機能パッケージは自動的にコンテキストを作成します。 –
どうか私に例を教えてもらえますか? – Finks