LINUX.ORG.RU

application/json with Network.Curl

 ,


0

1

Есть обычный курловый запрос c json'ом внутри вида

curl "url" -H "Content-Type: application/json" -H "Accept: application/json" -X POST --data '{ "value1" : "a", "value2" : "b" }

Как будет выглядеть эквивалент этому запросу с помощью Network.Curl?

И почему нижеприведённый код не эквивалентен вышеприведённому?

main = withCurlDo $ respBody <$> (curlGetResponse_ "url" [CurlPostFields ["{ \"value1\" : \"a\", \"value2\" : \"b\" }" ], CurlFailOnError False, CurlHttpHeaders ["Content-Type: application/json", "Accept: application/json"] ] :: IO (CurlResponse_ [(String, String)] String))

curl "http://example.com/" -H «Content-Type: application/json» -H «Accept: application/json» -X POST --data '{ «value1» : «a», «value2» : «b» }

$ sudo ngrep -d ppp0 -W byline port 80
...
POST / HTTP/1.1.
User-Agent: curl/7.24.0 (x86_64-pc-linux-gnu) libcurl/7.24.0 OpenSSL/1.0.0g zlib/1.2.6.
Host: example.com.
Content-Type: application/json.
Accept: application/json.
Content-Length: 34.
.
{ "value1" : "a", "value2" : "b" }
##
...
HTTP/1.0 302 Found.
Location: http://www.iana.org/domains/example/.
Server: BigIP.
Connection: Keep-Alive.
Content-Length: 0.
.

main = withCurlDo $ respBody <$> (curlGetResponse_ "http://example.com/" [CurlPostFields [«{ \„value1\“ : \„a\“, \„value2\“ : \„b\“ }» ], CurlFailOnError False, CurlHttpHeaders [«Content-Type: application/json», «Accept: application/json»] ] :: IO (CurlResponse_ [(String, String)] String))

$ sudo ngrep -d ppp0 -W byline port 80
...
POST / HTTP/1.1.
Host: example.com.
Content-Type: application/json.
Accept: application/json.
Content-Length: 34.
.
{ "value1" : "a", "value2" : "b" }
##
...
HTTP/1.0 302 Found.
Location: http://www.iana.org/domains/example/.
Server: BigIP.
Connection: Keep-Alive.
Content-Length: 0.
.

В чём проявляется неэквивалентность?

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Например:

import Control.Applicative
import Text.Printf
import Text.JSON
import Network.Curl

postGist :: String -> String -> String -> IO (Result JSValue)
postGist description file content = withCurlDo $ decode . respBody <$> curlAction

  where
    
    curlAction :: IO (CurlResponse_ [(String, String)] String)
    curlAction = curlGetResponse_ gistApiUrl [CurlPostFields [postJson]]

    gistApiUrl :: String
    gistApiUrl = "https://api.github.com/gists"

    postJson :: String
    postJson = printf
      "{\"description\":\"%s\",\"public\":\"true\",\"files\":{\"%s\":{\"content\":\"%s\"}}"
      description file content
quasimoto ★★★★
()
Ответ на: комментарий от dmitry_malikov

Почему при уже импортнутом модуле жсон запрос строится руками

Просто так. Конструкторами типа JSValue такую мелочь строить неудобно, элементарно придётся лишнее расписывать (хотя при этом JSON-строка и получится гарантированно валидной, это да), а нормальных комбинаторов на эту тему я не видел.

quasimoto ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.