gpt4 book ai didi

api - 优化多个网络请求

转载 作者:行者123 更新时间:2023-12-01 22:26:33 25 4
gpt4 key购买 nike

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

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

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

  • 读取表单文件。
  • 将其保存在本地磁盘中。
  • 加载文件并将其保存在字节缓冲区中。
  • 初始化多部分编写器
  • 向我的资源服务器
  • 发送请求
  • 得到结果,返回用户

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

    我的代码当前看起来像这样,此时身份验证是通过中间件完成的。有没有办法优化此流程?
    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)
    }

    最佳答案

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

    本质上,我只需要2行

    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",
    })
    }

    关于api - 优化多个网络请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59693671/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com