Создание привязок клиента в слое Haskell - ConnectionError - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь сделать привязки клиентов для API-интерфейса News, предоставленного newsapi.org, используя библиотеку слуг Haskell. Я создал следующую конечную точку:

type NewsAPI = "top-headlines" :> QueryParam "country" String :> QueryParam "apiKey" String :> Get '[JSON] TopHeadlines

И попытался назвать это следующим образом:

topheadlines :: Maybe String -> Maybe String -> ClientM TopHeadlines

api :: Proxy NewsAPI
api = Proxy

topheadlines = client api

query = topheadlines (Just "us") (Just "<api key>")

run3 :: IO ()
run3 = do
  manager' <- newManager defaultManagerSettings
  users <- runClientM query (mkClientEnv manager' (BaseUrl Https "newsapi.org/v2" 443 ""))
  print users

Я продолжаю получать сообщение об ошибке соединения, о котором я не совсем понимаю:

Left (ConnectionError "HttpExceptionRequest Request {\n host = \"newsapi.org/v2\"\n port = 443\n secure = True\n requestHeaders = [(\"Accept\",\"application/json;charset=utf-8,application/json\")]\n path = \"/top-headlines\"\n queryString = \"?country=us&api_key=90a38fab85c440fa88521e0789248f83\"\n method = \"GET\"\n proxy = Nothing\n rawBody = False\n redirectCount = 10\n responseTimeout = ResponseTimeoutDefault\n requestVersion = HTTP/1.1\n}\n TlsNotSupported")

Не уверен, почему нет связи. У меня есть другой набор привязок клиентов.

1 Ответ

0 голосов
/ 22 января 2019

Это комбинация двух вещей:

  1. api_key должно быть apiKey
  2. Положитесь на parseBaseUrl

    burl  <- parseBaseUrl "http://newsapi.org/v2"
    

Это сработало для меня в примере проекта, который я настроил.

{-# LANGUAGE DataKinds     #-}
{-# LANGUAGE TypeOperators #-}

module Main where

import           Control.Monad.Free
import           Servant.Client.Free

import qualified Network.HTTP.Client                as HTTP
import qualified Servant.Client.Internal.HttpClient as I

import           Network.Wai.Handler.Warp           (run)
import           Servant
import           System.Environment                 (getArgs)

type NewsAPI = "top-headlines" :> QueryParam "country" String :> QueryParam "apiKey" String :> Get '[JSON] String


topheadlines :: Maybe String -> Maybe String -> Free ClientF String
topheadlines = client api


api :: Proxy NewsAPI
api = Proxy


main :: IO ()
main = do
  test


test :: IO ()
test = case topheadlines (Just "us") (Just "API_KEY") of
    Pure n ->
        putStrLn $ "ERROR: got pure result: " ++ show n

    Free (Throw err) ->
        putStrLn $ "ERROR: got error right away: " ++ show err

    Free (StreamingRequest _req _k) ->
        putStrLn $ "ERROR: need to do streaming request" 
    Free (RunRequest req k) -> do
        burl  <- parseBaseUrl "http://newsapi.org/v2"
        mgr   <- HTTP.newManager HTTP.defaultManagerSettings

        let req' = I.requestToClientRequest burl req
        putStrLn $ "Making request: " ++ show req'

        res' <- HTTP.httpLbs req' mgr
        putStrLn $ "Got response: " ++ show res'
...