gpt4 book ai didi

Haskell Servant(客户端)- 带 header 的 GET 请求

转载 作者:行者123 更新时间:2023-12-02 18:28:45 24 4
gpt4 key购买 nike

我正在尝试使用 Haskell Servant 复制此curl 请求

curl -v -H 'Accept: application/vnd.twitchtv.v5+json' \
-H 'Client-ID: someapikey' \
-X GET 'https://api.twitch.tv/kraken/clips/top?game=Overwatch&period=week&trending=false&limit=3'

使用 Twitch API。文档 here

这就是我到目前为止所得到的

type Game = Text                                                                                                             

type Cursor = Text

type Language = Text

type Limit = Int

type Period = Text

type Trending = Bool

type Application = Text

type ClientID = Text

type SearchClips = "kraken"
:> "clips"
:> "top"
:> QueryParam "game" Game
:> QueryParam "cursor" Cursor
:> QueryParam "language" Language
:> QueryParam "limit" Limit
:> QueryParam "period" Period
:> QueryParam "trending" Trending
:> Header "Accept" Application
:> Header "Client-ID" ClientID
:> Get '[JSON] Search

searchClipAPI :: Proxy SearchClips
searchClipAPI = Proxy

search
:: Maybe Game
-> Maybe Cursor
-> Maybe Language
-> Maybe Limit
-> Maybe Period
-> Maybe Trending
-> Maybe Application
-> Maybe ClientID
-> ClientM Search
search = client searchClipAPI

baseURL :: BaseUrl
baseURL = BaseUrl Https "api.twitch.tv" 443 ""

这就是我使用 http-tls“运行”它的方式

runGameClipsSearchClient :: Maybe Text -> IO ()                                                                              
runGameClipsSearchClient game = do

mn <- NT.newTlsManager

let args = search
game
(Just "")
(Just "en")
(Just 50)
(Just "day")
(Just False)
(Just "application/vnd.twitchtv.v5+json")
(Just "someapikey")

envClient = mkClientEnv mn baseURL

pPrint =<< runClientM args envClient

但我一定做错了什么,因为我在 haskell 代码中收到“404:未找到”错误,但在curl请求中却没有收到错误。

我怀疑我的标题有问题,因为当我删除

'Accept: application/vnd.twitchtv.v5+json'

从curl请求中,我得到了完全相同的响应。

最佳答案

是的,servant-clientAcceptContent-Type header 有特殊处理 - 如果您尝试使用:> Header ... 机制,它们在 Servant.Client.Internal.HttpClient 中的函数 requestToClientRequest 中从请求中剥离出来。

我认为强制接受 Accept header 的最简单方法是向您的 Manager 添加请求修饰函数。这绝对是一个丑陋的黑客,但它似乎有效。 (我没有要测试的 Twitch 客户端 ID,但通过此修复,我得到了 400 而不是 404 错误,我相信这是进步。)

mn <- NT.newTlsManagerWith (NT.tlsManagerSettings { managerModifyRequest = fixAccept })
...
where fixAccept req
= return $ req { requestHeaders = ("Accept", "application/vnd.twitchtv.v5+json") :
filter (("Accept" /=) . fst) (requestHeaders req) }

关于Haskell Servant(客户端)- 带 header 的 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56986372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com