【发布时间】:2021-10-19 06:47:39
【问题描述】:
我是 Go 和 ES 的新手。我想转换以下代码:
query = `SELECT roll_no, name, school FROM students where roll_no = $1`
err = db.QueryRowContext(ctx, query, roll_no).Scan(&Student.ID, &Student.Name, &Student.School)
类似于以下 Elasticsearch 查询:
str = fmt.Sprintf(`{"query": { "match": { "roll_no" : %d } } }`, roll_no)
b := []byte(str)
// calls retrieve method, which is shown below
我正在使用 HTTP 调用连接到 ES,但以下代码在解析时显示 http: panic serving [::1]:5574: EOF 错误。
func retrieve(url string, b []byte) ([]byte, error) {
request, _ := http.NewRequest("GET", url, bytes.NewBuffer(b))
request.Header.Set("Content-Type", "application/json; charset=UTF-8")
client := &http.Client{}
response, error := client.Do(request)
if error != nil {
panic(error)
}
defer response.Body.Close()
body, _ := ioutil.ReadAll(response.Body)
s := Student{}
error = json.NewDecoder(response.Body).Decode(&s)
if error != nil {
panic(error)
}
fmt.Printf("Student: %v", s)
return body, error
}
无论如何我可以通过解析将它存储到一个对象中吗?
【问题讨论】:
-
你用什么与elasticsearch通信?
-
@mkopriva 对端口
:9200的简单http调用 -
在这种情况下,您可以读取 HTTP 响应正文,对其进行解析,然后将其解码为“对象”。如何进行解析和解码将取决于响应正文的内容 mime 类型。
-
您收到错误是因为
ioutil.ReadAll一直读取正文,并且正文会跟踪它,它有一个光标。因此,当您将其传递给 json.Decoder 并尝试解码光标位于末尾的主体时,您会得到 EOF(文件结尾)。 -
如果你想要body的原始字节和student实例,请将
json.NewDecoder(response.Body).Decode(&s)替换为json.Unmarshal(body, &s),即解组ioutil.ReadAll的输出。
标签: json go elasticsearch