Haskell: кодировка URL для данных поста


person Clinton    schedule 31.07.2012    source источник


Ответы (3)


Взгляните на urlEncodeVars.

urlEncodeVars :: [(String, String)] -> String
ghci> urlEncodeVars [("language", "Haskell"), ("greeting", "Hello, world!")]
"language=Haskell&greeting=Hello%2C%20world%21"
person icktoofay    schedule 31.07.2012
comment
Упс, пропустил это. Спасибо! - person Clinton; 31.07.2012

Если вы пытаетесь отправить данные 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.

person Erin Swenson-Healey    schedule 03.05.2016

Я рекомендую попробовать 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"
person Nick Pershyn    schedule 01.12.2019