多部分HTTP响应 [英] Multipart HTTP response
问题描述
目标是让Node.js/ hapi API服务器通过两件事来响应浏览器的AJAX请求:
The goal is for a Node.js / hapi API server to respond to a browser's AJAX request with two things:
- 媒体文件(例如图片)
- 带有有关文件元数据的JSON对象
这是两个单独的项目,只是因为不能轻松地将二进制数据存储在JSON中.否则,这将是单个资源.但是,最好将它们发送到单个响应中.
These are two separate items only because binary data cannot easily be stored in JSON. Otherwise, this would be a single resource. Nevertheless, it is preferable that they be sent in a single response.
我们使用multipart/form-data
在单个请求中上传这些内容.在这种情况下,浏览器提供了一种内置的机制来序列化主体,并且大多数服务器端框架都知道如何解析主体. 但是对于相反的响应,该如何做呢?也就是说,服务器应如何序列化该主体以将其传输给客户端?
We upload these in a single request with multipart/form-data
. In that case, browsers provide a built-in mechanism to serialize the body and most server-side frameworks know how to parse it. But how does one do the same for a response, in the opposite direction? Namely, how should a server serialize the body to transmit it to a client?
据我所知,multipart/mixed
可能是有用的内容类型.但是,关于此的讨论很少.大多数人似乎诉诸于提供两条单独的GET
路线,每条路线一条.我之所以不喜欢它,是因为它使您更容易进入比赛条件.我想念什么?
From what I can tell, multipart/mixed
could be a useful content type. But there is very little talk of this. Most people seem to resort to providing two separate GET
routes, one for each piece. I dislike that because it opens you up to race conditions, amongst other things. What am I missing?
另请参见 hapijs/discuss#563 中的问题.
推荐答案
您可以将响应用作multipart/form-data
并使用Response.formData()
在客户端读取响应
You can serve the response as multipart/form-data
and use Response.formData()
to read response at client
fetch("/path/to/server", {method:"POST", body:formData})
.then(response => response.formData())
.then(fd => {
for (let [key, prop] of fd) {
console.log(key, prop)
}
})
let fd = new FormData();
fd.append("json", JSON.stringify({
file: "image"
}));
fetch("data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==")
.then(response => response.blob())
.then(blob => {
fd.append("file", blob);
new Response(fd)
.formData()
.then(formData => {
for (let [key, data] of formData) {
console.log(key, data)
}
})
})
这篇关于多部分HTTP响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!