2017-03-20 1 views
0

Ich versuche eine Funktion zum Senden einer Datei über eine POST-Anfrage im mehrteiligen Format mit als Leitfaden zu erstellen, aber HTTPoison gibt mir zwei Fehler egal, was ich an der Form ändere. Sie sind alleEine mehrteilige HTTPoison-POST-Anfrage mit mehr Daten als der Datei erstellen

HTTPoison.post("https://api.telegram.org/myCredentials", {:multipart, form}, headers) 

und die drei Versionen meiner Form und die Fehler werden die folgenden (ob ich Header oder nicht):

1. und 2. Version (gleiche Fehler für beide):

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

Welche mir diesen Fehler geben:

** (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 

Und die dritte Version:

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

Welche mir folgende Fehler gibt:

** (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 

Ich finde unveränderliche Unglück in der Reihe von Ereignissen, die solche Hindernisse über einen mehrteiligen POST-Anfrage verhängen, so würde ich auf eine Meinung hören gerne über die möglichen Ursachen, die zu ihnen führen.

Jetzt wäre ich mehr als glücklich, meine eigene Anfrage von Grund auf this Format zu schreiben, aber ich zwinge mich, Elixir und seine Ressourcen zu verwenden, um es schließlich nach ein paar Pannen wie diesem zu lernen.

Antwort

0

Überprüfen Sie die Dokumentation für HTTPoison.post/3. Das zweite Argument ist ein body Typ, wenn Sie in der Dokumentation für diese Art spec suchen finden Sie:

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

Ihr zweites Argument nicht, dass typespec entsprechen. Sie senden .

Diese Github Issue auf HTTPoison scheint zu empfehlen, dass Sie {:multipart, []} verwenden können, obwohl es nicht die dokumentierte Spezifikation und an example test case for multipart is here entspricht.

Basierend auf Ihrem Beispiel, vielleicht so etwas wie:

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

+0

Das Problem mit der Form, wie Sie es nennen, ist, dass Telegramm api erfordert, dass die Datei im „Foto“ Objekt gesendet werden. Wie {chat_id: Ziel, Foto: multipart/form-data Datei, andere Parameter um die an die API gesendete Nachricht zu modifizieren}. Was schlägst du dafür vor? – Besto

+0

Ich erinnerte mich gerade, ich war in der Lage, eine Anfrage wie folgt zu senden: 'HTTPoison.post! URL, {: Formular, [einige: "Daten"]} ', die als Formular erfolgreich von HTTPbin erhalten wurde – Besto

+0

Wie Sie [hier] sehen können (https://github.com/edgurgel/httpoison/blob/master/ lib/httpoison/base.ex # L160), jede Anfrage, die der Code macht, kann nicht zwei oder mehr Argumente für '{: body, content}', '{: form, content}' usw. haben, da das dritte Argument dies tut als Kopfzeilen verarbeitet werden. Edit: Es scheint jedoch, dass Multipart dort gar nicht erwähnt wird. Möglichkeiten sind raw binary, char list oder iotlist oder tuple ': form',': file' oder ': stream' – Besto

Verwandte Themen