获取 Elasticsearch 响应
Getting Elasticsearch response
我正在使用 gin 框架构建一个 Api 以从 Elastic 获取数据。
问题是,当我 运行 应用程序时,我在第一个请求中成功获得响应,但之后在任何后续请求中我收到错误:
Error parsing the response body: EOF
弹性配置:
var cfg = elasticsearch.Config{
Password: GetConnectConfig().esPassword,
Username: GetConnectConfig().esUserName,
Addresses: GetConnectConfig().esHost,
Logger: &estransport.ColorLogger{
Output: os.Stdout,
}
我的请求处理函数如下所示:
func Search() gin.HandlerFunc {
client, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("elastic configuration failed %s", err)
}
res, err := client.Search(
client.Search.WithIndex(Index_Name),
client.Search.WithSize(10),
client.Search.WithPretty(),
)
if err != nil {
log.Fatalf("elastic failed to respond %s", err)
}
return func(c *gin.Context) {
r := map[string]interface{}{}
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err})
log.Fatalf("Error parsing the response body: %s", err) // Error
} else {
for _, hit := range r["hits"].(map[string]interface{})["hits"].([]interface{}) {
log.Printf(" * ID=%s, %s", hit.(map[string]interface{})["_id"], hit.(map[string]interface{})["_source"])
}
c.JSON(http.StatusOK, "success")
}
}
}
正如我所说,每次我 运行 应用程序时,我只能在第一个请求中获得响应。
我不确定这里错误的原因是什么。
我还尝试通过添加以下内容在搜索后关闭响应正文:
defer res.Body.Close()
但现在我收到以下错误:
Error parsing the response body: http2: response body closed
defer res.Body.Close()
应该在func(c *gin.Context){}里面哟。可以将您的搜索初始化移动到 func 中,并在里面做一个关闭之类的事情,客户端可以作为依赖项在这里注入。
return func(c *gin.Context) {
res, err := client.Search(
client.Search.WithIndex(Index_Name),
client.Search.WithSize(10),
client.Search.WithPretty(),
)
defer res.Body.Close()
}
}
我正在使用 gin 框架构建一个 Api 以从 Elastic 获取数据。 问题是,当我 运行 应用程序时,我在第一个请求中成功获得响应,但之后在任何后续请求中我收到错误:
Error parsing the response body: EOF
弹性配置:
var cfg = elasticsearch.Config{
Password: GetConnectConfig().esPassword,
Username: GetConnectConfig().esUserName,
Addresses: GetConnectConfig().esHost,
Logger: &estransport.ColorLogger{
Output: os.Stdout,
}
我的请求处理函数如下所示:
func Search() gin.HandlerFunc {
client, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("elastic configuration failed %s", err)
}
res, err := client.Search(
client.Search.WithIndex(Index_Name),
client.Search.WithSize(10),
client.Search.WithPretty(),
)
if err != nil {
log.Fatalf("elastic failed to respond %s", err)
}
return func(c *gin.Context) {
r := map[string]interface{}{}
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err})
log.Fatalf("Error parsing the response body: %s", err) // Error
} else {
for _, hit := range r["hits"].(map[string]interface{})["hits"].([]interface{}) {
log.Printf(" * ID=%s, %s", hit.(map[string]interface{})["_id"], hit.(map[string]interface{})["_source"])
}
c.JSON(http.StatusOK, "success")
}
}
}
正如我所说,每次我 运行 应用程序时,我只能在第一个请求中获得响应。 我不确定这里错误的原因是什么。
我还尝试通过添加以下内容在搜索后关闭响应正文:
defer res.Body.Close()
但现在我收到以下错误:
Error parsing the response body: http2: response body closed
defer res.Body.Close()
应该在func(c *gin.Context){}里面哟。可以将您的搜索初始化移动到 func 中,并在里面做一个关闭之类的事情,客户端可以作为依赖项在这里注入。
return func(c *gin.Context) {
res, err := client.Search(
client.Search.WithIndex(Index_Name),
client.Search.WithSize(10),
client.Search.WithPretty(),
)
defer res.Body.Close()
}
}