发出 Get 请求后的 Golang 程序 returns HTTP Status code 503 or pending

Golang program after making Get request returns HTTP Status code 503 or pending

我尝试通过发出获取请求从 kibana 服务器获取 csv 数据。 在此服务器向我发送响应数据后,我将其写入 csv 文件并保存在某处。
每次 csv 文件中只有一行“待定”。
Kibana 日志显示状态代码 503
但是如果我在浏览器中输入 url 我可以获得包含正确数据的 csv 文件。
可能我需要更多等待 kibana 的回复。
从我的角度来看,接下来的问题是:服务器可以向我发送单行“待处理”的响应,这意味着它需要更多时间来准备正确的响应。
我尝试增加客户端时间,但效果不佳

client := http.Client{
    Timeout: 10 * time.Second,
}

接下来是带有 go routines 和 channels/wait group 的想法:他们强制 Get 请求等待获取正确的数据而不是“待处理”和 503 状态代码


import (
    "encoding/json"
    "errors"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "sync"
)

type KibanaReportResponse struct {
    Path string `json:"path"`
}

var urlKibanaBase = "http://localhost:5601"
var urlKibanaPost = urlKibanaBase + "/api/reporting/generate/csv_searchsource?"
var urlParameters = "jobParams=%28browserTimezone%3AEurope%2FBerlin%2Ccolumns%3A%21%28%29%2CobjectType%3Asearch%2CsearchSource%3A%28fields%3A%21%28%28field%3A%27%2A%27%2Cinclude_unmapped%3Atrue%29%29%2Cindex%3Aec074c00-1f62-11ec-8056-8d208a1f6e77%2Cparent%3A%28filter%3A%21%28%29%2Cindex%3Aec074c00-1f62-11ec-8056-8d208a1f6e77%2Cquery%3A%28language%3Akuery%2Cquery%3A%27%27%29%29%2Csort%3A%21%28%28_score%3Adesc%29%29%2CtrackTotalHits%3A%21t%2Cversion%3A%21t%29%2Ctitle%3A%27Discover%20search%20%5B2021-09-27T09%3A19%3A44.977%2B02%3A00%5D%27%29"

var urlWithParam = urlKibanaPost + urlParameters
func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    pathCsvFile := getCsvPathFromKibana(urlWithParam)
    go getCsvFile(urlKibanaBase, pathCsvFile, &wg)
    defer wg.Wait()
}
func getCsvPathFromKibana(urlKib string) string {
    resKibana := KibanaReportResponse{}
    client := &http.Client{}
    if req, err := http.NewRequest("POST", urlKib, nil); err != nil {
        log.Println("Given a method, URL, andoptional body are wrong", err)
    } else {
        req.Header.Add("kbn-xsrf", "true")
        if res, err := client.Do(req); err != nil {
            log.Println("Probably problems depends on client policy or HTTP connection", err)
        } else {
            if err := json.NewDecoder(res.Body).Decode(&resKibana); err != nil {
                log.Println("Problem by Json decoding \n", err)
            } else {
                return resKibana.Path
            }
        }
    }

    return resKibana.Path
}
func getCsvFile(urlKibanaBase string, pathCsvFile string, wg *sync.WaitGroup) error {
    defer wg.Done()

    res, err := http.Get(urlKibanaBase + pathCsvFile)
    if err != nil {
        return err
    }
    defer res.Body.Close()
    switch res.StatusCode {
    case 200:
        dataBody, err := ioutil.ReadAll(res.Body)
        if err != nil {
            return err
        }
        err = ioutil.WriteFile("data.csv", dataBody, 0666)
        if err != nil {
            return err
        }
        return nil
    case 503:
        fmt.Println("probably 503/pending")
        return errors.New("probably 503/pending")
    }

    return nil
}

curl 请求

curl -v localhost:5601/api/reporting/jobs/download/ku5k3rxz00xs7fac46c0k12u 
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 5601 (#0)
> GET /api/reporting/jobs/download/ku5k3rxz00xs7fac46c0k12u HTTP/1.1
> Host: localhost:5601
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< kbn-csv-contains-formulas: true
< kbn-max-size-reached: false
< content-disposition: inline; filename="Discover search [2021-09-27T09:19:44.977+02:00].csv"
< content-type: text/csv; charset=utf-8
< x-content-type-options: nosniff
< referrer-policy: no-referrer-when-downgrade
< kbn-name: 3ae0cbefece4
< kbn-license-sig: 58d9fcb437ac7d3ac54d538e6d5ff9a039fde738ed3a940fa530e6d8b6ef6740
< cache-control: private, no-cache, no-store, must-revalidate
< content-length: 9013976
< vary: accept-encoding
< accept-ranges: bytes
< Date: Wed, 29 Sep 2021 14:06:19 GMT
< Connection: keep-alive
< Keep-Alive: timeout=120
< 
{ [13865 bytes data]
100 8802k  100 8802k    0     0  57.6M      0 --:--:-- --:--:-- --:--:-- 57.6M
* Connection #0 to host localhost left intact


显示我可以通过在浏览器中键入 url 路径来获取数据的屏幕截图

更新:
我尝试递归调用我的函数。但即使它现在有效,它也是一个糟糕的解决方案。

    case 503:
        getCsvFile(urlKibanaBase, pathCsvFile)

Kibana 服务器需要一些时间来准备响应。 我添加了一些代码,用于向通道发送信号等待一段时间,并在等待向客户端重复请求后

if res.StatusCode != 200 {
                    time.Sleep(30 * time.Second)
                }