如何轻松获取https发布回复数据?

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)

  • [http-enumerator]的开发者(https://github.com/snoyberg/http-enumerator#readme)已将未来的开发转移到新的软件包:[http-conduit](https://github.com/snoyberg/ HTTP的导管) (7认同)

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的区别

  1. 将自动为您设置POST方法.
  2. 已发布的有效内容将自动进行urlencoded.
  3. Content-Type自动设置为"application/x-www-form-urlencoded"