如何在Google应用引擎

时间:2017-01-22 22:27:40

标签: google-app-engine go

我在appengine中发出HTTP请求时遇到问题,因为它不支持http.Client。我正在创建一个slackbot并想要创建一个延迟响应。逻辑是,一旦我收到松弛的POST请求,我将成功响应并旋转goroutine调用外部API,并在完成之后,创建一个新的请求松弛。

似乎很容易,但我遇到的问题是使用appengine的urlfetchNewContext,因为NewContext接受* http.Request作为参数但是从那时起我立即响应第一个松弛请求,响应Body关闭,然后才能使用它来发出对外部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")
    }
}

1 个答案:

答案 0 :(得分:0)

使用enter image description here包执行请求范围之外的功能。

您还可以使用较低级别的delay包。延迟包位于taskqueue包之上。

使用延迟函数声明包级变量:

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")
  }
})

这样称呼:

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