首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化多个网络请求

优化多个网络请求
EN

Stack Overflow用户
提问于 2020-01-11 10:42:15
回答 1查看 57关注 0票数 0

我使用Python库创建了一个服务服务器的模型,它的唯一目的是在json中接受带有有效负载和返回结果的http请求。可以使用application/jsonmultipart/form-data提出请求。

为了对用户进行身份验证和授权,我使用Golang echo库创建了另一个服务器。因此,在到达我的资源服务器之前,所有用户请求都应该到达这里。

这里我有一个问题,因为我的程序需要图像作为输入,所以用户将使用FormData发送他们的请求。当它第一次击中我的Golang服务器时,我需要执行以下步骤

buffer.

  • Initialise
  1. 读取表单文件。
  2. 将其保存在本地磁盘中。
  3. 加载该文件并将其保存在字节
  4. 中。多部分编写器
  5. 向我的资源服务器

H 116获得结果,返回给用户H 217G 218

我觉得这是多余的,因为我认为有一种方法可以直接将这些请求传播到我的资源服务器(在完成auth之后),而不必通过I/O部分。

我的代码当前如下所示,此时身份验证是通过中间件完成的。有什么方法来优化这个流程吗?

代码语言:javascript
运行
复制
func (h Handler) ProcessFormData(c echo.Context) error {

    // some validation

    file, err := c.FormFile("file")
    if err != nil {
        return c.JSON(http.StatusBadRequest, response.Exception{
            Code:   errcode.InvalidRequest,
            Detail: "Invalid file uploaded",
            Error:  err,
        })
    }

    filePath, err := fileUtil.SaveNetworkFile(file)
    if err != nil {
        return c.JSON(http.StatusInternalServerError, response.Exception{
            Code:   errcode.SystemError,
            Detail: "Error when processing file",
            Error:  err,
        })
    }

    f, err := os.Open(filePath)
    if err != nil {
        return c.JSON(http.StatusInternalServerError, response.Exception{
            Code:   errcode.SystemError,
            Detail: "Error when processing file",
            Error:  err,
        })
    }
    defer f.Close()

    fi, err := f.Stat()
    if err != nil {
        return c.JSON(http.StatusInternalServerError, response.Exception{
            Code:   errcode.SystemError,
            Detail: "Error when processing file",
            Error:  err,
        })
    }

    var body bytes.Buffer
    writer := multipart.NewWriter(&body)
    part, err := writer.CreateFormFile("file", fi.Name())
    if err != nil {
        return c.JSON(http.StatusInternalServerError, response.Exception{
            Code:   errcode.SystemError,
            Detail: "Error when processing file",
            Error:  err,
        })
    }

    if _, err := io.Copy(part, f); err != nil {
        return c.JSON(http.StatusInternalServerError, response.Exception{
            Code:   errcode.SystemError,
            Detail: "Error when processing file",
            Error:  err,
        })
    }
    writer.Close()

    req, err := http.NewRequest("POST", fmt.Sprintf("%s", env.ResourceServer), &body)
    req.Header.Set("Content-Type", writer.FormDataContentType())
    if err != nil {
        return c.JSON(http.StatusInternalServerError, response.Exception{
            Code:  errcode.APIRequestError,
            Error: err,
        })
    }

    client := &http.Client{}
    res, err := client.Do(req)
    if err != nil {
        return c.JSON(http.StatusInternalServerError, response.Exception{
            Code:   errcode.APIRequestError,
            Detail: "Error when posting request to resource server",
            Error:  err,
        })
    }

    defer res.Body.Close()

    data, _ := ioutil.ReadAll(res.Body)

    if res.StatusCode != 200 {
        errorData := &model.PanicResponse{}
        err := json.Unmarshal(data, errorData)
        if err != nil {
            return c.JSON(http.StatusInternalServerError, response.Exception{
                Code:  errcode.UnmarshalError,
                Error: err,
            })
        }

        return c.JSON(res.StatusCode, errorData)
    }

    result := &model.SuccessResponse{}
    err = json.Unmarshal(data, result)
    if err != nil {
        return c.JSON(http.StatusInternalServerError, response.Exception{
            Code:  errcode.UnmarshalError,
            Error: err,
        })
    }

    if fileUtil.IsFileExists(filePath) {
        fileUtil.DeleteFile(filePath)
    }

    // track and update usage
    userData := c.Get("USER")
    user := userData.(model.User)
    db.UpdateUsage(h.Db, &user.ID)

    return c.JSON(200, result)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-12 07:15:13

通过@cerise-limón的评论找到了解决方案

基本上,我只需要两行

代码语言:javascript
运行
复制
f, err := file.Open()
if _, err := io.Copy(part, f); err != nil {
    return c.JSON(http.StatusInternalServerError, response.Exception{
        Code:   errcode.SystemError,
        Detail: "Error when processing file",
    })
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59693671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档