在一个HTTP请求中发送一个文件和参数(通过JSON)



我正在使用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);
});     
}

问题并不是关于Go或reactjs或任何特定的软件库。

要解决您的问题,您首先需要了解HTTPPOST是如何工作的,因此,我邀请您首先阅读MDN的介绍
简而言之:

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

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

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

HTML文档有两种方法可以让客户端呈现它,将其发送回服务器:a)嵌入一个包含查询参数的URL;这将使得客户端使用发送到服务器的这些参数来执行GET请求;b) 嵌入一个HTML"表单",当"提交"时,将使用从填写的表单中获取的数据执行更复杂的POST请求。

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

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

好吧,"web2.0"出现了,"XHR"(XMLHttpRequest)也被发明了。它的名字中有"XML",因为当时XML被一些人视为圣杯,可以解决任何计算问题(当然,它没有做到)。这种东西被认为能够发送几乎任意的数据有效载荷;至少支持XML和JSON编码。

需要理解的关键是,这种与服务器通信的方式与原始方式完全并行,它们唯一共享的是都使用HTTPPOST请求。

到目前为止,你可能已经看到了全貌:当代的JS库允许你构建和执行任何类型的请求:它们允许你创建一个"web表单"风格的请求,或者创建一个JS对象,并将其串行化为JSON,并在HTTPPOST请求中发送结果。

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

不同方法之间的区别在于,web表单样式的方法将负责为您编码文件的内容,而如果您选择在JSON对象中发送文件,则需要自己对其进行编码,例如使用base64编码。

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


总之,我建议暂停一下,对我上面概述的东西进行自我教育,然后再尝试解决问题,但这一次——对这些东西在引擎盖下是如何工作的,以及你打算如何使用它有相当全面的了解。

相关内容

  • 没有找到相关文章

最新更新