Go Web 服务 - 将 tar.gz 文件作为请求正文发布

我需要在处理 tar.gz 文件的 go 中实现 Web 服务,我想知道正确的方法是什么,我需要定义什么内容类型等。


另外,我发现很多事情都是自动处理的——在客户端我只是发布了一个 gzip 阅读器,因为请求正文和Accept-Encoding: gzip标头是自动添加的,而在服务器端——我不需要对请求正文进行压缩,它是已经提取到焦油。那有意义吗?


我可以相信任何客户都会这样吗?


服务器:


func main() {


    router := mux.NewRouter().StrictSlash(true)

    router.Handle("/results", dataupload.NewUploadHandler()).Methods("POST")

    log.Fatal(http.ListenAndServe(*address, router))

}

上传者:


package dataupload


import (

    "errors"

    log "github.com/Sirupsen/logrus"

    "io"

    "net/http"

)


// UploadHandler responds to /results http request, which is the result-service rest API for uploading results

type UploadHandler struct {

    uploader Uploader

}


// NewUploadHandler creates UploadHandler instance

func NewUploadHandler() *UploadHandler {


    return &UploadHandler{

        uploader: TarUploader{},

    }

}


func (uh UploadHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {


    retStatus := http.StatusOK

    body, err := getBody(request)

    if err != nil {

        retStatus = http.StatusBadRequest

        log.Error("Error fetching request body. ", err)

    } else {

        _, err := uh.uploader.Upload(body)

    }

    writer.WriteHeader(retStatus)

}


func getBody(request *http.Request) (io.ReadCloser, error) {


    requestBody := request.Body

    if requestBody == nil {

        return nil, errors.New("Empty request body")

    }

    var err error

    // this part is commented out since somehow the body is already gunzipped - no need to extract it.

    /*if strings.Contains(request.Header.Get("Accept-Encoding"), "gzip") {

        requestBody, err = gzip.NewReader(requestBody)

    }*/


    return requestBody, err

}


红糖糍粑
浏览 149回答 2
2回答

手掌心

由于以下代码,您为客户端编写的代码只是直接发送 tar 文件:reader, err := gzip.NewReader(f)...request, err := http.NewRequest("POST", "http://localhost:8080/results", reader)如果您.tar.gz直接发送文件内容,则需要在服务器上对其进行压缩。例如:request, err := http.NewRequest(..., f)我认为这更接近您应该期望第三方客户表现出的行为。

茅侃侃

显然不是,但也许...Golang 为 http 客户端(和服务器)提供了非常好的支持。这是最早支持 http2 的语言之一,API 的设计清楚地表明了他们对快速 http 的关注。这就是他们Accept-Econding: gzip自动添加的原因。这将大大减少服务器响应的大小,然后优化传输。但是 gzip 仍然是 http 1 中的一个选项,并非所有客户端都会将此标头推送到您的服务器。请注意,Content-Type描述了您发送的数据类型(这里是 tar.gz,但可能是application/json, test/javascript, ...),当Accept-Encoding描述数据为传输编码的方式时Go 将负责透明地Accept-Encoding为您处理数据,因为它负责数据的传输。然后由你来处理,Content-Type因为只有你知道如何给你收到的内容赋予意义
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go