Подтвердить что ты не робот

Как легко получить данные ответа отклика https?

Я разрабатываю игрушечную программу, которая использует API-интерфейс сокращения URL-адресов Google. Чтобы сократить URL-адрес, вам необходимо отправить этот запрос:

POST https://www.googleapis.com/urlshortener/v1/url
Content-Type: application/json

{"longUrl": "http://www.google.com/"}

и вы получите это как ответ:

{
 "kind": "urlshortener#url",
 "id": "http://goo.gl/fbsS",
 "longUrl": "http://www.google.com/"
}

Сначала я использую Network.HTTP, но обнаружил, что он не поддерживает HTTPS, а API Google поддерживает только HTTPS. Поэтому я перехожу к Network.Curl. Я нахожу, что есть удобная функция для HTTP GET

curlGetString :: URLString -> [CurlOption] -> IO (CurlCode, String)

но нет такой функции для HTTP POST. Хуже того, я не могу найти способ получить данные ответа HTTP POST. Все, что я знаю, это то, что я могу выдать запрос HTTP POST с помощью

curlPost :: URLString -> [String] -> IO ()

Может ли кто-нибудь показать мне выход? Спасибо.

4b9b3361

Ответ 1

Просто, чтобы предоставить альтернативное решение с помощью 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

Ответ 2

Чтобы предоставить другую альтернативу 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

Отличия от http-enumerator

  • Метод POST автоматически устанавливается для вас.
  • Опубликованная полезная нагрузка автоматически указана в urlencoded.
  • Content-Type автоматически устанавливается как "application/x-www-form-urlencoded"

Ответ 3

Если вы посмотрите на источник curlPost, вы увидите, что он делает это:

curlPost s ps = initialize >>= \ h -> do
  setopt h (CurlVerbose True)
  setopt h (CurlPostFields ps)
  setopt h (CurlCookieJar "cookies")
  setopt h (CurlURL s)
  perform h
  return ()

Итак, я думаю, вам нужно сделать аналогичную вещь, но вместо двух последних строк напишите

  resp <- perform_with_response h

Также похоже, что setopt не экспортируется, но setopts есть, поэтому вы можете использовать это вместо.