我一直在查看Network.HTTP
,但找不到创建正确 URL 编码的键/值对的方法。
例如,如何从[(key, value)]
配对列表中生成所需的发布数据?我想这样的东西已经存在(可能隐藏在Network.HTTP
包装中)但我找不到它,我宁愿不重新发明轮子。
我一直在查看Network.HTTP
,但找不到创建正确 URL 编码的键/值对的方法。
例如,如何从[(key, value)]
配对列表中生成所需的发布数据?我想这样的东西已经存在(可能隐藏在Network.HTTP
包装中)但我找不到它,我宁愿不重新发明轮子。
urlEncodeVars :: [(String, String)] -> String
ghci> urlEncodeVars [("language", "Haskell"), ("greeting", "Hello, world!")]
"language=Haskell&greeting=Hello%2C%20world%21"
如果您正在尝试 HTTP POST 数据x-www-form-urlencoded
,urlEncodeVars
可能不是正确的选择。该urlEncodeVars
函数不符合application/x-www-form-urlencoded 编码算法有两点值得注意:
%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
。
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"