为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
红糖糍粑 2022-01-17 19:58:22
我需要在处理 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 datauploadimport (    "errors"    log "github.com/Sirupsen/logrus"    "io"    "net/http")// UploadHandler responds to /results http request, which is the result-service rest API for uploading resultstype UploadHandler struct {    uploader Uploader}// NewUploadHandler creates UploadHandler instancefunc 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}
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

由于以下代码,您为客户端编写的代码只是直接发送 tar 文件:


reader, err := gzip.NewReader(f)

...

request, err := http.NewRequest("POST", "http://localhost:8080/results", reader)

如果您.tar.gz直接发送文件内容,则需要在服务器上对其进行压缩。例如:


request, err := http.NewRequest(..., f)

我认为这更接近您应该期望第三方客户表现出的行为。


查看完整回答
反对 回复 2022-01-17
?
茅侃侃

TA贡献1842条经验 获得超21个赞

显然不是,但也许...

Golang 为 http 客户端(和服务器)提供了非常好的支持。这是最早支持 http2 的语言之一,API 的设计清楚地表明了他们对快速 http 的关注。

这就是他们Accept-Econding: gzip自动添加的原因。这将大大减少服务器响应的大小,然后优化传输。

但是 gzip 仍然是 http 1 中的一个选项,并非所有客户端都会将此标头推送到您的服务器。

请注意,Content-Type描述了您发送的数据类型(这里是 tar.gz,但可能是application/jsontest/javascript, ...),当Accept-Encoding描述数据为传输编码的方式时

Go 将负责透明地Accept-Encoding为您处理数据,因为它负责数据的传输。然后由你来处理,Content-Type因为只有你知道如何给你收到的内容赋予意义


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信