2016-07-07 17 views
2

Ich habe eine Liste in Erlang, die ich in einen Querystring-Parameter konvertieren und über HTTP senden muss. Das Senden über HTTP ist kein Problem, der Parameter querystring ist jedoch nicht so formatiert, wie ich es möchte. Ich habe versucht, zwei Dinge:Konvertieren und formatieren Sie eine Liste zu String in Erlang

Snippet 1

error_logger:info_msg("~p", [Mylist]), %% ==> prints [<<"foo">>,<<"bar">>] 
Response = httpc:request("http://someserver/someaction?mylist=" ++ [Mylist]). 
%% ==> Server receives Mylist param as: 'foobar' but I want it to be 'foo/bar' 

Snippet 2

error_logger:info_msg("~p", [Mylist]), %% ==> prints [<<"foo">>,<<"bar">>] 
IOList = io_lib:format("~p", [Mylist]), 
FlatList = lists:flatten([IOList]), 
Response = httpc:request("http://someserver/someaction?mylist=" ++ [FlatList]). 
%% ==> Server receives Mylist param as: '[<<"foo">>,<<"bar">>]' but I want it to be 'foo/bar' 

Kann mir jemand helfen mit der Umwandlung und die Formatierung der Liste in einer Weise, dass ich alle Einzelteile empfangen können in der Liste getrennt mit einem '/' Zeichen

Vielen Dank im Voraus

Antwort

5

Wenn Sie ein / Zeichen zwischen den Listenelementen in der URL angezeigt werden möchten, müssen Sie es dort einfügen. Eine Möglichkeit, das zu tun, ist mit lists:join/2:

Response = httpc:request("http://someserver/someaction?mylist=" ++ lists:join("/", Mylist)). 

Dies führt zu einer iolist bestehend aus Streichern und Binärdateien als URL Argument httpc:request/1 übergeben werden, die für mich gearbeitet, wenn ich es versuchte, aber ist streng genommen nicht korrekt, da Die httpc documentation sagt, der URL-Typ ist eine Zeichenfolge. Um dies zu erreichen, können Sie die Binärdateien in Mylist zuerst konvertieren und glätten das verbundene Ergebnis eine Zeichenfolge zu erhalten:

Value = lists:flatten(lists:join("/", [binary_to_list(B) || B <- Mylist])), 
Response = httpc:request("http://someserver/someaction?mylist=" ++ Value). 

Edit: beachten Sie, dass lists:join/2 nur in Erlang/OTP 19.0 oder neuer verfügbar ist; Für ältere Versionen können Sie stattdessen string:join/2 verwenden, beachten Sie jedoch, dass die Argumente umgekehrt sind, d. h. das Trennzeichen "/" muss das zweite Argument sein, nicht das erste.

+2

Beachten Sie, dass 'lists: join/2' nur in den letzten 19.x hinzugefügt wurde. Kann in früheren Versionen 'string: join/2' verwenden. –

+0

@DerekBrown: guter Punkt - Ich habe den Beitrag bearbeitet, um dies zu beachten. –

Verwandte Themen