以下是我正在使用的示例代码:
@body """
--13eba0c1a6344d0ca6850a87303ced0f
Content-Disposition: form-data; name="exists"
overwrite
--13eba0c1a6344d0ca6850a87303ced0f
Content-Disposition: form-data; name="file"; filename="10.jpg"
Content-Type: image/jpeg
<content>
--13eba0c1a6344d0ca6850a87303ced0f--
"""
test "a test" do
headers = [
{"Content-Type", "multipart/form-data; boundary=13eba0c1a6344d0ca6850a87303ced0f"},
{"Content-Length", byte_size(@body)}
]
conn = %Plug.Conn{req_headers: headers}
|> Plug.Adapters.Test.Conn.conn(:post, "/a/post/path", @body)
IO.puts "Conn headers: #{inspect conn.req_headers}"
IO.puts "Conn adapter body:\n #{elem(conn.adapter, 1).req_body}\n-------------------------"
IO.puts "Conn body_params before Parser: #{inspect conn.body_params}"
conn = Plug.Parsers.call(conn, Plug.Parsers.init(parsers: [Plug.Parsers.MULTIPART], pass: ["*/*"]))
IO.puts "Conn body_params after Parser: #{inspect conn.body_params}"
end
这是控制台中的输出:
Conn headers: [{"Content-Type", "multipart/form-data; boundary=13eba0c1a6344d0ca6850a87303ced0f"}, {"Content-Length", 263}]
Conn adapter body:
--13eba0c1a6344d0ca6850a87303ced0f
Content-Disposition: form-data; name="exists"
overwrite
--13eba0c1a6344d0ca6850a87303ced0f
Content-Disposition: form-data; name="file"; filename="10.jpg"
Content-Type: image/jpeg
<content>
--13eba0c1a6344d0ca6850a87303ced0f--
-------------------------
Conn body_params before Parser: %Plug.Conn.Unfetched{aspect: :body_params}
Conn body_params after Parser: %{}
根据我对multipart / form-data请求的格式的理解,这应该解析为包含“file”和“exists”键的映射。当我对基于插件的服务器发出真正的POST请求时,会正确解析请求,并且body_params包含带有预期密钥的映射。
这是一个形式错误的邮政体格式吗?这是Plug.Adapters.Test.Conn代码中的缺陷/限制吗?当我解析康恩时,我是否以微妙的方式做错了什么?
我可以通过直接传递mock'd预解析的Conn结构来测试这个接口,但我宁愿不这样做。