HTTPoison Multipart Опубликовать запрос к Spree API
При попытке опубликовать изображение в API-интерфейсе Spree ProductImage с помощью HTTPoison происходит сбой с ошибкой 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
Для сравнения вот захват RequestBin обоих сбойных запросов HTTPoison, за которыми следует успешный запрос Curl: https://requestb.in/12et7bp1?inspect
Что мне нужно сделать, чтобы HTTPoison хорошо играл с этим Rails API?
1 ответ
Content-Disposition
строка требует двойных кавычек вокруг name
а также filename
ценности. curl
добавляет их автоматически, но Хакни передает указанные вами данные как есть, поэтому вам нужно добавить двойные кавычки к значениям самостоятельно.
Это:
[{"name", "image[attachment]"}, {"filename", "42757187_001_b4.jpeg"}]
должно быть:
[{"name", ~s|"image[attachment]"|}, {"filename", ~s|"42757187_001_b4.jpeg"|}]
(Я использую только ~s
sigil, так что двойные кавычки могут быть добавлены без их выхода. ~s|""|
точно так же, как "\"\""
.)