gpt4 book ai didi

haskell - 在仆人中发送通用内容类型

转载 作者:行者123 更新时间:2023-12-04 08:33:15 24 4
gpt4 key购买 nike

我正在尝试转发一些 ByteString返回客户端(浏览器)。客户端将不知道所请求文档的内容类型,因此我试图将适当的内容类型响应发送回客户端。该文档可以是图像或pdf或word文档等。

例如,客户端将请求 /document?id=55服务器将响应相应的内容类型和相关的ByteString .

我按照示例 here : 我为图像创建了一些东西。

 data IMAGE

instance Accept IMAGE where
contentType _ = "image" M.// "jpeg"

instance MimeRender IMAGE LBS.ByteString where
mimeRender _ = id

挑战在于客户端不会发送带有某些特定 Accept: 的请求。标题,所以我无法像完成 here 那样对适当的 Mime 类型使用react.另外,上述内容仅适用于图像(假设浏览器会推断出 png 即使我发回 jpeg )但不适用于 pdf , docx ,ETC。

我想到了像 MyDynamicContent String 这样的参数化类型我将在运行时传递内容类型,但我不确定如何声明我的 API,即我将使用什么来代替 '[JSON] .甚至不确定这样的事情是否可能,因为这些示例只是一个简单的数据类型。

所以我的问题是,如果我想发送一些 ByteString作为响应并设置 Content-Type动态标题,使用 servant 的最佳方法是什么?

更新:我开了一个 issue

最佳答案

这是可能的,但有点hack:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverlappingInstances #-}
module DynCT where

import Control.Monad.Trans.Either
import Data.ByteString.Lazy (ByteString)
import Servant
import Servant.API.ContentTypes
import Network.Wai.Handler.Warp

data WithCT = WithCT { header :: ByteString, content :: ByteString }

instance AllCTRender xs WithCT where
handleAcceptH _ _ (WithCT h c) = Just (h, c)

type API = Get '[] WithCT

api :: Proxy API
api = Proxy

server :: Server API
server = return $ WithCT { header = "example", content = "somecontent" }

main :: IO ()
main = run 8000 $ serve api server

测试它:
  % curl localhost:8000 -v
...
< HTTP/1.1 200 OK
...
< Content-Type: example
<
...
somecontent%

这个想法只是通过声明 AllCTRender 的重叠实例来覆盖正常行为。 .请注意,您可能还需要为 servant-client 做一些额外的工作。 , servant-docs等等,如果你也在使用这些。鉴于此,您可能希望在 repo 中打开一个关于此的问题以获得更完整的支持。

关于haskell - 在仆人中发送通用内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35636829/

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