kev*_*hen 23 https haskell google-api
我正在开发一个使用Google URL缩短器API的玩具程序.要缩短网址,您需要发送此请求:
POST https://www.googleapis.com/urlshortener/v1/url
Content-Type: application/json
{"longUrl": "http://www.google.com/"}
Run Code Online (Sandbox Code Playgroud)
你会得到这个作为回应:
{
"kind": "urlshortener#url",
"id": "http://goo.gl/fbsS",
"longUrl": "http://www.google.com/"
}
Run Code Online (Sandbox Code Playgroud)
起初我使用Network.HTTP,但发现它不支持HTTPS,而Google的API仅支持HTTPS.所以我转向Network.Curl.我发现HTTP GET有一个方便的功能
curlGetString :: URLString -> [CurlOption] -> IO (CurlCode, String)
Run Code Online (Sandbox Code Playgroud)
但HTTP POST没有这样的功能.更糟糕的是,我找不到获取HTTP POST响应数据的方法.我所知道的是我可以使用发出HTTP POST请求
curlPost :: URLString -> [String] -> IO ()
Run Code Online (Sandbox Code Playgroud)
谁能告诉我一个出路?谢谢.
hvr*_*hvr 15
只是通过使用http-enumerator提供替代解决方案:
{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Enumerator
import Network.HTTP.Types
import qualified Data.ByteString.Lazy as L
main = do
req0 <- parseUrl "https://www.googleapis.com/urlshortener/v1/url"
let req = req0 { method = methodPost
, requestHeaders = [("Content-Type", "application/json")]
, requestBody = RequestBodyLBS "{\"longUrl\": \"http://www.google.com/\"}"
}
res <- withManager $ httpLbs req
L.putStrLn $ responseBody res
Run Code Online (Sandbox Code Playgroud)
Dav*_*rak 15
使用http-conduit提供另一种替代方法:
{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L
main = do
initReq <- parseUrl "https://www.googleapis.com/urlshortener/v1/url"
let req' = initReq { secure = True } -- Turn on https
let req = (flip urlEncodedBody) req' $
[ ("longUrl", "http://www.google.com/")
-- ,
]
response <- withManager $ httpLbs req
L.putStr $ responseBody response
Run Code Online (Sandbox Code Playgroud)
与http-enumerator的区别