HTTPoison Multipart Post 请求 Spree API
HTTPoison Multipart Post Request to Spree API
尝试使用 HTTPoison post 将图像 ProductImage API 发送到 Spree 的 ProductImage API 时,失败并出现 Rails 错误 NoMethodError (undefined method 'permit' for #<ActionDispatch::Http::UploadedFile:0x007f94fa150040>)
。我用来生成此请求的 Elixir 代码是:
def create() do
data = [
{:file, "42757187_001_b4.jpeg",
{"form-data", [{"name", "image[attachment]"}, {"filename", "42757187_001_b4.jpeg"}]},
[{"Content-Type", "image/jpeg"}]
}, {"type", "image/jpeg"}
]
HTTPoison.post!("http://localhost:3000/api/v1/products/1/images", {:multipart, data}, ["X-Spree-Token": "5d096ecb51c2a8357ed078ef2f6f7836b0148dbcc536dbfc", "Accept": "*/*"])
end
我可以通过以下调用使用 Curl 使其工作:
curl -i -X POST \
-H "X-Spree-Token: 5d096ecb51c2a8357ed078ef2f6f7836b0148dbcc536dbfc" \
-H "Content-Type: multipart/form-data" \
-F "image[attachment]=@42757187_001_b4.jpeg" \
-F "type=image/jpeg" \
http://localhost:3000/api/v1/products/1/images
为了比较,下面是失败的 HTTPoison 请求和成功的 Curl 请求的 RequestBin 捕获:
https://requestb.in/12et7bp1?inspect
我需要做什么才能让 HTTPoison 与此 Rails API 很好地配合使用?
Content-Disposition
行requires double quotes around the name
and filename
values。 curl
会自动添加这些值,但 Hackney 按原样传递您指定的数据,因此您需要自己将双引号添加到值中。
这个:
[{"name", "image[attachment]"}, {"filename", "42757187_001_b4.jpeg"}]
应该是:
[{"name", ~s|"image[attachment]"|}, {"filename", ~s|"42757187_001_b4.jpeg"|}]
(我只使用 ~s
印记,以便可以添加双引号而无需转义。~s|""|
与 "\"\""
完全相同。)
尝试使用 HTTPoison post 将图像 ProductImage API 发送到 Spree 的 ProductImage API 时,失败并出现 Rails 错误 NoMethodError (undefined method 'permit' for #<ActionDispatch::Http::UploadedFile:0x007f94fa150040>)
。我用来生成此请求的 Elixir 代码是:
def create() do
data = [
{:file, "42757187_001_b4.jpeg",
{"form-data", [{"name", "image[attachment]"}, {"filename", "42757187_001_b4.jpeg"}]},
[{"Content-Type", "image/jpeg"}]
}, {"type", "image/jpeg"}
]
HTTPoison.post!("http://localhost:3000/api/v1/products/1/images", {:multipart, data}, ["X-Spree-Token": "5d096ecb51c2a8357ed078ef2f6f7836b0148dbcc536dbfc", "Accept": "*/*"])
end
我可以通过以下调用使用 Curl 使其工作:
curl -i -X POST \
-H "X-Spree-Token: 5d096ecb51c2a8357ed078ef2f6f7836b0148dbcc536dbfc" \
-H "Content-Type: multipart/form-data" \
-F "image[attachment]=@42757187_001_b4.jpeg" \
-F "type=image/jpeg" \
http://localhost:3000/api/v1/products/1/images
为了比较,下面是失败的 HTTPoison 请求和成功的 Curl 请求的 RequestBin 捕获: https://requestb.in/12et7bp1?inspect
我需要做什么才能让 HTTPoison 与此 Rails API 很好地配合使用?
Content-Disposition
行requires double quotes around the name
and filename
values。 curl
会自动添加这些值,但 Hackney 按原样传递您指定的数据,因此您需要自己将双引号添加到值中。
这个:
[{"name", "image[attachment]"}, {"filename", "42757187_001_b4.jpeg"}]
应该是:
[{"name", ~s|"image[attachment]"|}, {"filename", ~s|"42757187_001_b4.jpeg"|}]
(我只使用 ~s
印记,以便可以添加双引号而无需转义。~s|""|
与 "\"\""
完全相同。)