2016-07-07 144 views
2

我在erlang中有一个列表,我需要将其转换为查询字符串参数并通过http发送。通过http发送没有问题,但querystring参数没有按照我想要的格式进行格式化。我想两件事情:将列表转换并格式化为erlang中的字符串

片段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' 

片段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' 

有人可以帮助我在我可以接受的所有项目的方式转换和格式化列表在列表中用'/'分隔

在此先感谢

回答

5

如果你想要一个/字符出现在URL中的列表元素之间,你必须把它放在那里。要做到这一点的方法之一是lists:join/2

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

这导致iolist由字符串和二进制文件的URL参数httpc:request/1,这工作对我来说,当我尝试它传递的,但严格不正确的,因为httpc documentation表示URL类型是一个字符串。为了实现这一目标,我们也可以将二进制文件Mylist第一和扁平连接结果得到一个字符串:

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

编辑:请注意,只有lists:join/2在二郎山/ OTP 19.0或更高版本可用;对于旧版本,您可以改为使用string:join/2,但请注意参数颠倒了,即"/"分隔符必须是第二个参数,而不是第一个参数。

+2

请注意'list:join/2'只在最近的19.x中添加。在这种情况下,可以在早期版本中使用'string:join/2'。 –

+0

@ DerekBrown:好点 - 我编辑了这个帖子来记下这一点。 –

相关问题