Создание многочастного запроса HTTPoison POST с большим количеством данных, кроме файла
Я пытаюсь создать функцию для отправки файла через POST-запрос в многочастном формате, используя это как руководство, но HTTPoison продолжает выдавать мне две ошибки, независимо от того, какие изменения я внесу в форму. Они все
HTTPoison.post("https://api.telegram.org/myCredentials", {:multipart, form}, headers)
и три версии моей формы и ошибки следующие (использую ли я заголовки или нет):
1-я и 2-я версии (одинаковые ошибки для обоих):
form = [{"photo", [{"name", "myphoto.jpg"}, {:file, "files/aphoto.jpg"}]}, {"chat_id", 237799110}]
-----
form = [photo: [{"name", "myphoto.jpg"}, {:file, "files/aphoto.jpg"}], chat_id: 237799110]
Которые дают мне эту ошибку:
** (FunctionClauseError) no function clause matching in anonymous fn/2 in :hackney_multipart.len_mp_stream/2
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_multipart.erl:159: anonymous fn({"photo", [{"name", "myphoto.jpg"}, {:file, "files/aphoto.jpg"}]}, 0) in :hackney_multipart.len_mp_stream/2
(stdlib) lists.erl:1263: :lists.foldl/3
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_multipart.erl:159: :hackney_multipart.len_mp_stream/2
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_request.erl:319: :hackney_request.handle_body/4
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_request.erl:81: :hackney_request.perform/2
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney.erl:373: :hackney.send_request/2
(httpoison) lib/httpoison/base.ex:432: HTTPoison.Base.request/9
И третья версия:
form = [chat_id: 237799110, photo: [{"name", "myphoto.jpg"}, {:file, "files/aphoto.jpg"}]]
Что дает мне следующую ошибку:
** (ArgumentError) argument error
:erlang.byte_size(:chat_id)
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_multipart.erl:255: :hackney_multipart.mp_data_header/2
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_multipart.erl:180: anonymous fn/3 in :hackney_multipart.len_mp_stream/2
(stdlib) lists.erl:1263: :lists.foldl/3
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_multipart.erl:159: :hackney_multipart.len_mp_stream/2
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_request.erl:319: :hackney_request.handle_body/4
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_request.erl:81: :hackney_request.perform/2
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney.erl:373: :hackney.send_request/2
Я нахожу неизменное несчастье в серии событий, которые налагают такие препятствия на многочастный запрос POST, поэтому я хотел бы выслушать мнение о возможных причинах, которые к ним приводят.
Теперь, я был бы более чем рад написать свой собственный запрос с нуля, следуя этому формату, но я вынужден использовать Elixir и его ресурсы, чтобы в конечном итоге изучить его после нескольких неудач, подобных этой.
1 ответ
Проверьте документацию для HTTPoison.post/3
, 2-й аргумент body
введите, который, если вы посмотрите в документации для этого типа спецификации вы найдете:
body :: binary | {:form, [{atom, any}]} | {:file, binary}
Ваш второй аргумент не соответствует этому типу спецификации. Вы отправляете {:multipart, form}
,
Эта проблема Github на HTTPoison, кажется, предлагает вам использовать {:multipart, []}
даже если он не соответствует задокументированной спецификации, и здесь приведен пример тестового примера для multipart.
Исходя из вашего примера, может быть что-то вроде:
form = [{:file, "files/aphoto.jpg"}, {"name", "myphoto.jpg"}, {"chat_id", 237799110}]