Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 多部分HTTP响应_Javascript_Node.js_Server_Multipart_Hapijs - Fatal编程技术网

Javascript 多部分HTTP响应

Javascript 多部分HTTP响应,javascript,node.js,server,multipart,hapijs,Javascript,Node.js,Server,Multipart,Hapijs,Node.js/API服务器的目标是通过两件事响应浏览器的AJAX请求: 媒体文件(如图像) 包含文件元数据的JSON对象 这是两个单独的项,只是因为二进制数据不能轻松地存储在JSON中。否则,这将是一个单一的资源。然而,最好是在一个响应中发送它们 我们使用多部分/表单数据在单个请求中上载这些数据。在这种情况下,浏览器提供了一种内置机制来序列化主体,大多数服务器端框架都知道如何解析主体但如何对响应执行相反方向的相同操作?即,服务器应如何序列化主体以将其传输到客户端 据我所知,multipar

Node.js/API服务器的目标是通过两件事响应浏览器的AJAX请求:

  • 媒体文件(如图像)
  • 包含文件元数据的JSON对象
这是两个单独的项,只是因为二进制数据不能轻松地存储在JSON中。否则,这将是一个单一的资源。然而,最好是在一个响应中发送它们

我们使用
多部分/表单数据在单个请求中上载这些数据。在这种情况下,浏览器提供了一种内置机制来序列化主体,大多数服务器端框架都知道如何解析主体但如何对响应执行相反方向的相同操作?即,服务器应如何序列化主体以将其传输到客户端

据我所知,
multipart/mixed
可能是一种有用的内容类型。但很少有人谈论这一点。大多数人似乎求助于提供两条独立的
GET
路线,每件一条。我不喜欢这一点,因为它让你更容易接受比赛条件。我错过了什么


另请参见中的我的问题。

如果您选择的是多部分格式,我认为在上传(POST/PUT)和检索(GET)过程中使用完全相同的格式没有任何内在的错误

我认为在使用HTTP时,在两个方向上使用相同的在线格式绝对是一种优雅

但是,如果您想在PUT/POST和JSON期间使用GET发送表单数据,那么我会开始质疑这样做是否正确

如果客户端只想显示图像,那么multipart会让他们感到恼火。您是否考虑过只使用不同的端点;一个是图像,一个是元数据?您有什么理由想将它们合并到一个资源中

或者,您也可以尝试将信息嵌入到图像中。例如,JPEG允许使用EXIF添加自定义数据。至少您保留了直接打开图像的功能

但是,我最后要说的是,如果您只想嵌入一个图像+一个json对象,那么
多部分/mixed
是合适的,但请记住:

  • 这可能有点不方便消费
  • 这也有点不寻常
  • 我相当肯定,多部分编码将要求您以7比特的编码方式对图像进行编码,这将内在地导致请求大小大大增加
    您可以将响应作为
    multipart/formData
    提供,并使用
    response.formData()
    在客户端读取响应

    fetch("/path/to/server", {method:"POST", body:formData})
    .then(response => response.formData())
    .then(fd => {
      for (let [key, prop] of fd) {
        console.log(key, prop)
      }
    })
    
    让fd=newformdata();
    fd.append(“json”,json.stringify({
    文件:“图像”
    }));
    取回("数据:image/gif;base64,r0lgodlheaaqapiap///waaamlcwkjcqgaagjiyokcgpkskih+gknyzw0zwqgd2l0acbhamf4bg9hzc5pbmzvac5bakaaaaif8ltkvuuuuuuuuuuuuuuuuyljadaqaaaaaaaaaaaaaaaaaaaaqaadmwi63p4wyklre2mioggznadomgzzzzzzzzydydajrxwwwwgzg2lzg2lzykad2lzzkkzzzzzzykad2mcg2ld2lzk2lzk2lzk2lzk2lzk2lzzk2lzzk2lzk2lzk2lzk2lzk2lzzAeaaaazyiujijk8PBYjdFYVBovjha70GU7XsujhmkWKJZ7RF8AYPDZBQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQf8OfQfQfQfQfQfQfQfQfQf8OfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQfQlQGBMLAJibufbSlKAAAh+QQACGACWAAAAAAAAAAAQAADMGI63P7WCRHZNFFVDMGU2NFWLWCI3WGC3TSWHUFGXTAUKGCBTGENBMJAEJSXGMLWZPEACH5BAACAAAAAAAAAQABAAAMYCLRC/JDKSATLQTSCKDCECAJDI7HCQ4EMTCYRCYRGHVTQLAIB1YCHICNLSRKAAAAAAAAAAAAAAAAA=”)
    .then(response=>response.blob())
    .然后(blob=>{
    fd.append(“文件”,blob);
    新回应(fd)
    .formData()
    。然后(formData=>{
    for(让formData的[键,数据]){
    console.log(键、数据)
    }
    })
    
    })
    “因为媒体文件无法轻松存储在JSON中“您是否尝试过在
    JSON
    响应中将图像作为
    数据URI
    提供服务?将图像转换为base64,将JSON转换为base64,然后使用
    分隔符将其连接为字符串是否适合您?”?你可以把它作为一个字符串发送,然后在前面对它进行解码。这就是我所说的“容易”的部分含义。我可以对媒体文件进行base64编码,但这不仅增加了额外的处理,而且使文件大小增加了约33%。我想我只是很惊讶这在一个方向上是一个干净解决的问题,而在另一个方向上则不是这样。您可以将响应作为
    多部分/表单数据
    ,并使用
    响应.formData()
    很酷,我不知道
    响应.formData()
    。这在这里很有用。现在我必须弄清楚如何在服务器上构造响应。我基本上需要的是相反的。在回复中发送表单感觉很奇怪。但是呃,不管怎样,对吗?:)知道构建响应的好库吗?据我所知,hapi和任何其他框架都不知道如何序列化表单,只知道如何解析表单。我希望这样做,以便能够返回一个.pdf和json,其中包含签名框的位置以及后续电子签名所需的其他控件。我想同时返回这些,因为构建.pdf需要时间才能知道签名的位置。我可以做两个终结点:pdf和pdf&json。@MichaelPotter我想这个问题和答案已经有一段时间了,但如果你不能只做两个请求,我还是会问你一个问题…@尽管我很感激你的怀疑。我正在生成一个pdf,它可能需要相当长的时间才能生成。在生成.pdf文件的同时,我还生成了一些信息,这些信息将传递给电子签名解决方案,告诉它在哪里签名以及其他信息。因为您的持续性骨架,我想出了两次调用的想法,第一步生成pdf和json。第一步将缓存json