Как отправить файл в качестве ответа

#rest #go

#rest #Вперед

Вопрос:

Я создаю приложение REST с вариантом использования, в котором клиент отправляет запрос GET с некоторыми параметрами, а на стороне сервера API обрабатывает его и создает tar-файл. В конце он должен отправить этот tar-файл клиенту, например, для автоматической загрузки на основе запроса. Любая помощь здесь? Я застрял после создания файла tar, не уверен, как я могу отправить этот файл клиенту (например, автоматическая загрузка)

Пример кода для эмуляции моего вопроса

 func main() {
    http.HandleFunc("/", someHandle)

    port := ":8080"
    err := http.ListenAndServe(port, nil)
    if err != nil {
        log.Println(err)
    }

 }

func someHandle(res http.ResponseWriter, req *http.Request){
     ...
     ... 
     some code 
     ...
     
     file, err := createFile(filePath)
     ...
     //Now I have to send this file as response, any thoughts?
}
  

Комментарии:

1. Если file в io.Writer , то io.Copy(res, file) . Что это за тип file ?

Ответ №1:

Я полагаю, http.ServeFile — это то, что вы ищете.

Вот рабочий пример:

 package main

    import (
        "log"
        "net/http"
    )
    
    type Server struct {
        listenPort string
    }
    
    func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        router := http.NewServeMux()
    
        router.HandleFunc("/download", s.downloadHandler)
        router.ServeHTTP(w, r)
    }
    
    func (s *Server) downloadHandler(w http.ResponseWriter, r *http.Request) {
        http.ServeFile(w,r, "file.tar.xz")
    }
    
    func main(){
        s := amp;Server{listenPort: ":8080"}
    
        if err := http.ListenAndServe(s.listenPort, s); err != nil {
            log.Fatalf("could not listen on port %s: %v", s.listenPort, err)
        }
    }