2016-08-29 7 views
1

着信HTTPリクエストでは、ペイロードをバックグラウンドで処理し続けながら、202 Acceptedステータスコードで応答する必要がありました。リクエストを適切に閉じてバックグラウンドで処理を続ける方法

package main 

import (
    "fmt" 
    "log" 
    "net/http" 
    "time" 

    "github.com/nbari/violetear" 
) 

func sleep() { 
    time.Sleep(3 * time.Second) 
    fmt.Println("done...") 
} 

func index(w http.ResponseWriter, r *http.Request) { 
    w.WriteHeader(http.StatusAccepted) 
    go sleep() 
} 

func main() { 
    router := violetear.New() 
    router.HandleFunc("*", index) 

    http.Handle("/", router) 
    log.Fatal(http.ListenAndServe(":8080", router)) 
} 

基本的に、私はちょうどゴルーチン内WriteHeader以降の呼び出しsleep機能を使用し、ハンドラに:場合

func index(w http.ResponseWriter, r *http.Request) { 
    w.WriteHeader(http.StatusAccepted) 
    go sleep() 
} 

私は希望例示の目的のために、これは私が現在やっているものです「200 OK」で応答したいと、私は例えば、単純なリターン、できることに気づく:私は常に返す必要がある場合

func index(w http.ResponseWriter, r *http.Request) { 
    go sleep() 
    return 
} 

。したがって不思議を私は閉じるようにしたい:

func index(w http.ResponseWriter, r *http.Request) { 
    w.WriteHeader(http.StatusAccepted) 
    go sleep() 
    return 
} 

それともヘッダを書き込むことによって、およびゴルーチンを呼び出して、次は十分です。

答えて

0

ハンドラからの返却で十分であり、実行する必要があります。 http.Handlerから引用:要求が終了する信号を返す

。 ResponseWriterを使用したり、ServeHTTP呼び出しの完了後に、または同時にRequest.Bodyから読み取ることは無効です。

最後のreturnステートメントは不要であることに注意してください。単純に省略することができます。最後のステートメントが実行されたときにハンドラから実行が返され、実行から終了する関数を完了するまで待つことはありません。

また、HTTPヘッダーが設定されていない場合は、返信時に自動的に200 OKが設定されます(この場合、200 OKは自動的に設定されます)。あなたが202 Acceptedをしたいのであれば、次は必要最小限である:

func index(w http.ResponseWriter, r *http.Request) { 
    w.WriteHeader(http.StatusAccepted) 
    go sleep() 
} 

ちょうどあなたが、彼らは再利用することができるよう、ハンドラから戻った後、あなたは同時ゴルーチンでhttp.ResponseWriterhttpRequest値を使用していないことを確認しますので、あなたはそれらを読むことを試みるべきではありません。

関連する問題