Haskell:发布数据的URL编码

时间:2012-07-31 02:56:51

标签: haskell post url-encoding

我一直在关注Network.HTTP,但无法找到一种方法来创建正确的URL编码键/值对。

如何生成[(key, value)]对列表中所需的发布数据?我想这样的事情已经存在(可能隐藏在Network.HTTP包中)但我无法找到它,而我宁愿不重新发明轮子。

3 个答案:

答案 0 :(得分:8)

看看urlEncodeVars

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-urlencodedurlEncodeVars可能不是正确的选择。 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"