Web Services 将大型JSON有效负载发送到Web服务的方法

5cg8jx4n  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(166)

考虑一个小型Go应用程序,它读取一个2GB以上的大型JSON文件,将JSON数据封送到一个结构体中,并将JSON数据POST到一个Web服务端点。
接收有效负载的Web服务改变了它的功能,现在每个有效负载的大小限制为25MB。在Go语言中解决这个问题的最佳方法是什么?我已经想到了以下方法,但是我不确定这是不是最好的方法:
1.创建一个函数,将大JSON文件拆分为多个较小的文件(最大20MB),然后迭代这些文件,发送多个较小的请求。
与当前用于发送整个JSON负载的函数类似的函数:

func sendDataToService(data StructData) {
    payload, err := json.Marshal(data)
    if err != nil {
        log.Println("ERROR:", err)
    }

    request, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(payload))
    if err != nil {
        log.Println("ERROR:", err)
    }

    client := &http.Client{}
    response, err := client.Do(request)
    log.Println("INFORMATIONAL:", request)
    if err != nil {
        log.Println("ERROR:", err)
    }
    defer response.Body.Close()
}
uqdfh47h

uqdfh47h1#

您可以将输入分成块,然后分别发送每个块:

dec := json.NewDecoder(inputStream)
tok, err := dec.Token()
if err != nil {
    return err
}
if tok == json.Delim('[') {
    for {
        var obj json.RawMessage
        if err := dec.Decode(&obj); err != nil {
            return err
        }
        // Here, obj contains one element of the array. You can send this
        // to the server.
        if !dec.More() {
            break
        }
    }
}
cfh9epnr

cfh9epnr2#

由于服务器端可以渐进地处理数据,因此我假设可以将大的JSON对象拆分成较小的块。
1.使用HTTP请求
优点:在客户端实现起来非常简单。
缺点:发出数百个HTTP请求可能会很慢。你还需要处理超时-这是额外的复杂性。

*使用WebSocket消息

如果接收端支持WebSockets,则分步流程如下所示:

  • 将输入数据分割成较小的部分。
  • 连接到WebSocket服务器。
  • 从较小的片段开始发送消息,直到文件结束。
  • 关闭与服务器的连接。

这种解决方案可能性能更高,因为您不需要像使用HTTP那样在每次发送消息时都连接和断开服务器。
然而,这两种解决方案都假设您需要在服务器端组装所有部分。例如,您可能需要将数据与相关ID沿着发送,以便让服务器知道您正在发送什么文件,并发送一个特定的文件结束消息,以便让服务器知道文件何时结束。在WebSocket服务器的情况下,您可以假设在单个连接会话期间发送整个文件。

相关问题