Похоже, ваш сервер закрывает соединение. Проверьте, есть ли у вас таймауты и почему запрос занимает так много времени.
Вы можете обработать scanner.Text () асинхронно, чтобы сканирование не блокировалось, чтобы searchAPI отвечал, а тело запроса не открывалось слишком долго.
resp.Header().Set("Content-Type", "text/plain")
scanner := bufio.NewScanner(req.Body)
ctx := context.Background()
for scanner.Scan() {
itemID := scanner.Text()
go func(itemID string){
category := api.SearchAPI.FindCategory(itemID, lang, ctx)
_, _ = fmt.Fprintf(resp, "%v,%v \n", itemID, category)
count++ //ENSURE YOU HAVE AN ATOMIC COUNTER INCREMENT, OR INCREMENT AFTER itemID IS READ
}(itemID)
}
if err := scanner.Err(); err != nil {
logger.Errorf("scan file error: %v", err)
http.Error(resp, err.Error(), http.StatusBadRequest)
return
}
//.....
}
Кроме того, вы можете просто собрать все идентификаторы элементов в срезе, закрыть тело запроса и затем обработать их один за другим.
resp.Header().Set("Content-Type", "text/plain")
scanner := bufio.NewScanner(req.Body)
ctx := context.Background()
itemIDs := make([]string, 0)
for scanner.Scan() {
itemID := scanner.Text()
itemIDs = append(itemIDs, itemID)
}
if err := scanner.Err(); err != nil {
logger.Errorf("scan file error: %v", err)
http.Error(resp, err.Error(), http.StatusBadRequest)
return
}
for _, itemID := range itemIDs {
category := api.SearchAPI.FindCategory(itemID, lang, ctx)
_, _ = fmt.Fprintf(resp, "%v,%v \n", itemID, category)
count++
}
//.....
}