我一直在关注Network.HTTP
,但无法找到一种方法来创建正确的URL编码键/值对。
如何生成[(key, value)]
对列表中所需的发布数据?我想这样的事情已经存在(可能隐藏在Network.HTTP
包中)但我无法找到它,而我宁愿不重新发明轮子。
答案 0 :(得分:8)
urlEncodeVars :: [(String, String)] -> String
ghci> urlEncodeVars [("language", "Haskell"), ("greeting", "Hello, world!")]
"language=Haskell&greeting=Hello%2C%20world%21"
答案 1 :(得分:3)
如果您尝试HTTP POST数据x-www-form-urlencoded
,urlEncodeVars
可能不是正确的选择。 urlEncodeVars
函数在两个方面值得注意,不符合application/x-www-form-urlencoded encoding algorithm:
%20
而不是+
*
编码为%2A
而不是*
请注意Network.HTTP.Base
中函数旁边的注释:
-- Encode form variables, useable in either the
-- query part of a URI, or the body of a POST request.
-- I have no source for this information except experience,
-- this sort of encoding worked fine in CGI programming.
有关符合编码的示例,请参阅hspec-wai
包中的this function。
答案 2 :(得分:1)
我建议为此尝试wreq
。它提供了FormParm
数据类型,因此您需要将键值对转换为[FormParm]
。然后,您可以使用以下内容:
import qualified Data.ByteString.Char8 as C8
import Network.Wreq (post)
import Network.Wreq.Types (FormParam(..))
myPost = post url values where
values :: [FormParam]
values = [C8.pack "key" := ("value" :: String)]
url = "https://some.domain.name"