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|""| точно так же, как "\"\"".)

Другие вопросы по тегам