-1

我正在使用 Go 创建一个服务器,它允许客户端上传文件,然后使用服务器函数来解析文件。目前,我正在使用两个单独的请求:1)第一个请求发送用户上传的文件 2)第二个请求将参数发送到服务器需要解析文件的服务器。

但是,我意识到由于程序的性质,如果多个用户尝试同时使用服务器,可能会出现并发问题。我的解决方案是使用互斥锁。但是,我正在接收文件,发送响应,然后接收参数,当互斥锁被锁定时,Go 似乎无法发回响应。我正在考虑通过在一个 HTTP 请求中同时发送文件和参数来解决这个问题。有没有办法做到这一点?谢谢

示例代码(仅相关部分):

从客户端发送文件的代码:

handleUpload() {
        const data = new FormData()

        for(var x = 0; x < this.state.selectedFile.length; x++) {
            data.append('myFile', this.state.selectedFile[x])
        }

        var self = this;
        let url = *the appropriate url*
        axios.post(url, data, {})
        .then(res => {
            //other logic
            self.handleParser();
        })
}

handleParser() 的代码:

    handleNessusParser(){

        let parserParameter = {
        SourcePath : location,
        ProjectName : this.state.projectName
        }

        // fetch the the response from the server
        let self = this;
        let url = *url*
        fetch(url, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(parserParameter),

        }).then( (response) => {

        if(response.status === 200) {

           //success logic
        }


        }).catch (function (error) {

        console.log("error: ", error);

        });     
    }
4

1 回答 1

0

这个问题实际上与 Go 或 reactjs 或任何特定的软件库无关。

要解决您的问题,您首先需要了解 HTTP POST 的工作原理,因此我邀请您首先阅读MDN 上的此介绍
简而言之:

  • 有多种方法可以对 POST 请求中发送的数据进行编码。
  • 接收方处理这些数据的方式取决于发送方如何对其进行编码。
  • 发送者必须将编码与其请求进行通信——通常通过Content-Type标头字段。

我不会详细介绍可能的编码——参考的介绍性材料涵盖了它们,你应该对它们进行自己的研究,但也许回顾一下那里写的内容,这里有一些观点。

早在 80 年代和 90 年代,网络是“静态的”,而可怕的 JavaScript 繁重的“网络应用程序”时代还没有到来。“静态”意味着您不能在客户端的浏览器中运行任何代码,并且必须以纯 HTML 形式对与服务器的任何通信进行编码。

HTML 文档可以有两种方法让客户端渲染它以将某些内容发送回服务器: a) 嵌入一个包含查询参数的 URL;这将使客户端执行将这些参数发送到服务器的 GET 请求;b) 嵌入一个 HTML“表单”,当“提交”时,将导致执行一个相当复杂的 POST 请求,其中的数据取自填写的表单。

后一种方法是利用浏览器执行相当复杂的数据处理能力的方法——例如在特定表单的控件中对用户选择的文件进行 slurp,对其进行适当的编码并将其与其他表单的数据一起发送到服务器。
有两种方法可以对表单的数据进行编码,链接的文章都涵盖了它们,请阅读它们。

要理解这种“带有表单的静态 Web”方法的关键在于它的工作原理是这样的:服务器发送一个包含 Web 表单的 HTML 文档,浏览器呈现该文档,用户填写表单并单击“提交”浏览器呈现的按钮;浏览器从表单的控件中收集数据,对于“文件”类型的条目,它读取并编码这些文件的内容,最后执行 HTTP POST 请求,并将这些内容编码到表单指定的 URL。服务器通常会响应另一个 HTML 文档,依此类推。

好的,所以出现了“web 2.0”,并且发明了“XHR”(XMLHttpRequest)。它的名称中有“XML”,因为那时 XML 被某些人视为可以解决任何计算问题的圣杯(当然,它没有做到这一点)。那个东西被发明成能够发送几乎任意的数据有效载荷;至少支持 XML 和 JSON 编码。

要理解的关键是,这种与服务器通信的方式与原始方式完全平行,唯一的共同点是它们都使用 HTTP POST 请求。

现在你应该可以看到全貌了:当代的 JS 库允许你构建和执行任何类型的请求:它们允许你创建一个“Web 表单”风格的请求或创建一个 JS 对象,并将其序列化为 JSON,并在 HTTP POST 请求中发送结果。

如您所见,任何方法都允许您将包含多个不同数据的结构化数据传递给服务器,而处理这一切的方式是服务器和客户端之间的协议问题,即 API 约定,如果你要。

各种方法之间的区别在于,web-form-style 方法会为您处理文件内容的编码,而如果您选择以 JSON 对象形式发送文件,则需要自己对其进行编码——比如说,使用base64编码。

组合方法也是可能的。
例如,您可以直接将文件的二进制数据作为 POST 请求的正文发送,并通过将一组参数编码为 URL 的查询参数来提交请求。同样,这取决于客户端和服务器之间关于后者如何编码要发送的数据以及前者如何解码它们的协议。


总而言之,我建议暂停一下,对我上面概述的内容进行自我教育,然后再尝试解决问题,但这一次——对这些内容在引擎盖,以及您打算如何使用它。

于 2020-06-12T11:29:26.107 回答