在 Deno/Oak 的 HTTP 响应中使用 FormData
Use FormData in an HTTP Response in Deno/Oak
我知道我可以在客户端创建一个 FormData 并将其发送到服务器(在本例中我使用 Deno/Oak),然后从那里读取它。
但反之亦然吗?
如果我在 Oak 中有一条路线,并且我希望它发送一个多部分响应(带有一个或多个 blob,以及一个或多个字符串),我该怎么做?
Oak 的 automatic response body handling supports FormData
so you can set context.response.body
到 FormData
的一个实例,Oak 会处理剩下的事情。例如:
import { Application } from "https://deno.land/x/oak@v9.0.0/mod.ts";
const app = new Application();
app.use((ctx) => {
const data = new FormData();
data.append("string1", "Hi");
data.append("string2", "Bye");
data.append("blob1", new Blob(['<a id="a">Hi</a>'], { type: "text/xml" }));
data.append("blob2", new Blob(['<b id="b">Bye</b>'], { type: "text/xml" }));
ctx.response.body = data;
});
await app.listen({ port: 8000 });
% curl localhost:8000
------7115155097707325061106360125
Content-Disposition: form-data; name="string1"
Hi
------7115155097707325061106360125
Content-Disposition: form-data; name="string2"
Bye
------7115155097707325061106360125
Content-Disposition: form-data; name="blob1"; filename="blob"
Content-Type: text/xml
<a id="a">Hi</a>
------7115155097707325061106360125
Content-Disposition: form-data; name="blob2"; filename="blob"
Content-Type: text/xml
<b id="b">Bye</b>
------7115155097707325061106360125--
可以直接在 Deno 中完成相同的操作,无需任何额外的框架:
const server = Deno.listen({ port: 8000 });
for await (const conn of server) serveHttp(conn);
async function serveHttp(conn: Deno.Conn) {
const httpConn = Deno.serveHttp(conn);
for await (const requestEvent of httpConn) {
const data = new FormData();
data.append("string1", "Hi");
data.append("string2", "Bye");
data.append("blob1", new Blob(['<a id="a">Hi</a>'], { type: "text/xml" }));
data.append("blob2", new Blob(['<b id="b">Bye</b>'], { type: "text/xml" }));
requestEvent.respondWith(new Response(data));
}
}
我知道我可以在客户端创建一个 FormData 并将其发送到服务器(在本例中我使用 Deno/Oak),然后从那里读取它。
但反之亦然吗?
如果我在 Oak 中有一条路线,并且我希望它发送一个多部分响应(带有一个或多个 blob,以及一个或多个字符串),我该怎么做?
Oak 的 automatic response body handling supports FormData
so you can set context.response.body
到 FormData
的一个实例,Oak 会处理剩下的事情。例如:
import { Application } from "https://deno.land/x/oak@v9.0.0/mod.ts";
const app = new Application();
app.use((ctx) => {
const data = new FormData();
data.append("string1", "Hi");
data.append("string2", "Bye");
data.append("blob1", new Blob(['<a id="a">Hi</a>'], { type: "text/xml" }));
data.append("blob2", new Blob(['<b id="b">Bye</b>'], { type: "text/xml" }));
ctx.response.body = data;
});
await app.listen({ port: 8000 });
% curl localhost:8000
------7115155097707325061106360125
Content-Disposition: form-data; name="string1"
Hi
------7115155097707325061106360125
Content-Disposition: form-data; name="string2"
Bye
------7115155097707325061106360125
Content-Disposition: form-data; name="blob1"; filename="blob"
Content-Type: text/xml
<a id="a">Hi</a>
------7115155097707325061106360125
Content-Disposition: form-data; name="blob2"; filename="blob"
Content-Type: text/xml
<b id="b">Bye</b>
------7115155097707325061106360125--
可以直接在 Deno 中完成相同的操作,无需任何额外的框架:
const server = Deno.listen({ port: 8000 });
for await (const conn of server) serveHttp(conn);
async function serveHttp(conn: Deno.Conn) {
const httpConn = Deno.serveHttp(conn);
for await (const requestEvent of httpConn) {
const data = new FormData();
data.append("string1", "Hi");
data.append("string2", "Bye");
data.append("blob1", new Blob(['<a id="a">Hi</a>'], { type: "text/xml" }));
data.append("blob2", new Blob(['<b id="b">Bye</b>'], { type: "text/xml" }));
requestEvent.respondWith(new Response(data));
}
}