Выполнение составного запроса HTTPoison POST с большим количеством данных, кроме файла

Я пытаюсь создать функцию для отправки файла через запрос POST в многостраничном формате, используя this в качестве руководства, но 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-запроса, поэтому я хотел бы выслушать мнение о возможных причинах, которые к ним приводят.

Теперь я был бы более чем счастлив написать свой собственный запрос с нуля, следуя этот формат, но я заставляю себя использовать Эликсир и его ресурсы, чтобы в конечном итоге изучить его после нескольких подобных неудач.


person Besto    schedule 20.03.2017    source источник


Ответы (1)


Ознакомьтесь с документацией для HTTPoison.post/3. Второй аргумент - это тип body, который, если вы посмотрите документацию по спецификации этого типа, вы найдете:

body :: binary | {:form, [{atom, any}]} | {:file, binary}

Ваш второй аргумент не соответствует этому типу. Вы отправляете {:multipart, form}.

Эта проблема Github на HTTPoison, похоже, предполагает, что вы можете использовать {:multipart, []}, даже если это не так. t соответствуют задокументированной спецификации, и здесь.

Основываясь на вашем примере, возможно, что-то вроде:

form = [{:file, "files/aphoto.jpg"}, {"name", "myphoto.jpg"}, {"chat_id", 237799110}]

person cpjolicoeur    schedule 20.03.2017
comment
Проблема с формой, как вы ее выразили, заключается в том, что Telegram api требует, чтобы файл был отправлен в объекте фотографии. Например, {chat_id: destination, photo: multipart / form-data file, другие параметры для изменения сообщения, отправляемого в api}. Что вы предлагаете для этого? - person Besto; 20.03.2017
comment
Я только что вспомнил, мне удалось отправить такой запрос: HTTPoison.post! url, {:form, [some: "data"]}, который был успешно получен HTTPbin в виде формы. - person Besto; 20.03.2017
comment
Как вы можете видеть здесь, любой запрос в коде не может быть двух или более аргументов для {:body, content}, {:form, content} и т. д., поскольку третий аргумент будет обрабатываться как заголовки. Изменить: Однако кажется, что multipart вообще не упоминается. Возможны необработанный двоичный файл, список символов или список iotlist или кортеж :form, :file или :stream - person Besto; 20.03.2017