2016-11-03 15 views
1

異なる時間に異なる応答を返すようにサーバーに要求する必要があります。つまり、サーバーは異なる応答を生成し、これらの応答は異なる実行時間を要するため、サーバーは応答が利用可能になるとすぐに応答を返します。複数の応答の非同期リクエストgolang

そして、サーバーが私を返すとすぐに、これらの応答を画面に表示したい(私はそれを解決するつもりです)。

私が今までにできることは、サーバーがすべての応答を返すときだけ、応答を印刷することです。したがって、最初の応答に1秒かかり、最後の応答に10秒かかる場合、私のコードはすべてのメッセージを印刷するために10秒待つ必要があります。

EDITは:私が持っているコードを追加します

//Config is gotten from yml file 
RestConfig  = Config["rest"].(map[string]interface{}) 
ServerConfig  = Config["server"].(map[string]interface{}) 
RequestUrl  := ServerConfig["url"] 

RequestReader := bytes.NewReader(body) 
Request, _  := http.NewRequest("POST", RequestUrl.(string), RequestReader) 

//AppendHeaders append the needing headers to the request 
client.AppendHeaders(Request, RestConfig["headers"]) 

//the type of client.HttpClient is *http.Client 
Response, _  := client.HttpClient.Do(Request) 

//And to print in the screen 
defer Response.Body.Close() 

fmt.Println("-> Receiving response:\n---\n") 
fmt.Println(Response , "\n---\n-> Response body:\n---\n") 
body_resp, _ := ioutil.ReadAll(Response.Body) 
fmt.Println(string(body_resp)) 
fmt.Println("\n--\n") 

それを行うにはどのような方法を?

ありがとうございました。

答えて

3

最後に私のコードは、このようなものです:

package main 

import (
    "fmt" 
    "log" 
    "bytes" 
    "strings" 
    "bufio" 
    "net/http" 
) 

func main() { 
    var body = "The body" 
    RequestReader := bytes.NewReader([]byte(body)) 
    req, err := http.NewRequest("POST", "the_url", RequestReader) 
    if err != nil { 
    log.Fatal(err) 
    } 
    req.Header.Add("Accept", "application/xml") 
    req.Header.Add("Content-Type", "application/xml") 
    req.Header.Add("AG-Authorization", "key") 
    req.Header.Add("AG-Forwarded-Hosts", "*") 

    resp, err := (&http.Client{}).Do(req) 
    if err != nil { 
    log.Fatal(err) 
    } 
    reader := bufio.NewReader(resp.Body) 
    message := "" 
    for { 
    line, err := reader.ReadBytes('\n') 
    if err != nil { 
     log.Fatal(err) 
} 
    message = message + string(line) 
    if strings.Contains(message, "<!-- End mark for each message -->"){ 
     fmt.Println(message) 
     message = "" 
    } 
    } 
} 

ありがとうございます。

1

パッケージcontextはあなたが探しているパッケージです。

contextパッケージは、プロセスとサーバー要求のシグナルキャンセルと操作期限を処理します。これには、公開方法としてWithCancelWithTimeoutの2つがあります。着信要求に関連付けられたContextは、通常、要求ハンドラが復帰すると取り消されます。

特定のケースでは、WithTimeoutメソッドを使用して、バックエンドサーバーへの要求の期限を設定できます。

// WithTimeout returns a copy of parent whose Done channel is closed as soon as 
// parent.Done is closed, cancel is called, or timeout elapses. The new 
// Context's Deadline is the sooner of now+timeout and the parent's deadline, if 
// any. If the timer is still running, the cancel function releases its 
// resources. 
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) 

そして、ここで、この記事を見て、さらに読書のためにhttps://blog.golang.org/context/server/server.go

timeout, err := time.ParseDuration(req.FormValue("timeout")) // set a time limit in your post 
if err == nil { 
    // The request has a timeout, so create a context that is 
    // canceled automatically when the timeout expires. 
    ctx, cancel = context.WithTimeout(context.Background(), timeout) 
} else { 
    ctx, cancel = context.WithCancel(context.Background()) 
} 
defer cancel() // Cancel ctx as soon as handleSearch returns. 

から取られたスニペットです: https://blog.golang.org/context

+0

こんにちは@SimoEndre私はそれを行う方法については分かりません。私は例(server.go)をテストしていて、1)それは私には役に立たない(常に0の結果を得る)。そして2)最も重要なのは、私はGoogleのパッケージコードをダウンロードし、必要な方法で修正する(これは私の新しいコードhttp://pasted.co/2f56d290です)、これは以前と全く同じように動作します。それは要求を行い、サーバーは2つの応答を送信し(最初は応答時間の1秒で、2番目は6秒)、httpクライアントは最後の応答を待機します。あなたは私のコードを見てみることができますか?ありがとう。 –

+0

私は、apiサーバーが異なる時間間隔でリクエストを処理していることに恐れています。この場合、何もできません。または私は何かを逃したのですか? –

+0

ありがとう@SimoEndre私はサーバー開発チームと話をします。 –

関連する問題