2016-02-25 6 views
6

मैं कुछ ByteString क्लाइंट (ब्राउज़र) पर वापस रिले करने की कोशिश कर रहा हूं। क्लाइंट को अनुरोध किए जा रहे दस्तावेज़ के सामग्री-प्रकार को नहीं पता होगा, इसलिए मैं क्लाइंट को उचित सामग्री-प्रकार प्रतिक्रिया भेजने की कोशिश कर रहा हूं। दस्तावेज़ एक छवि या पीडीएफ या शब्द दस्तावेज़, आदि हो सकता हैनौकरियों में जेनेरिक सामग्री-प्रकार भेजना

उदाहरण के लिए, ग्राहक /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 किया जाता है प्रतिक्रिया करने के लिए के लिए कोई रास्ता नहीं है। इसके अलावा उपर्युक्त केवल छवियों के लिए काम करेगा (मानते हैं कि ब्राउज़र png का अनुमान लगाएंगे, यहां तक ​​कि मैं jpeg वापस भेजता हूं) लेकिन pdf, docx आदि के लिए नहीं।

मैं MyDynamicContent String की तरह एक paramaterized प्रकार के बारे में सोचा और मैं रन-टाइम में सामग्री प्रकार में पारित करेंगे लेकिन मुझे यकीन है कि मैं अपने एपीआई जैसे कि, क्या मैं '[JSON] के बजाय का उपयोग करेगा कैसे घोषणा करेंगे नहीं हूँ। निश्चित नहीं है कि ऐसी चीज भी संभव है क्योंकि उदाहरण सिर्फ एक साधारण डेटाटाइप हैं।

तो मेरी सवाल है, अगर मैं एक प्रतिक्रिया के रूप में कुछ ByteString भेजने और Content-Type हैडर गतिशील निर्धारित करते हैं, क्या सबसे अच्छा तरीका यह करने के लिए उपयोग कर रहा servant

अपडेट हो जाएगा चाहते हैं: मैं एक issue खोला है

+0

सर्वर कैसे तय करता है कि किस सामग्री-प्रकार का जवाब देना है? (विशेष रूप से, केवल यह सुनिश्चित करने के लिए, यह स्थिर रूप से निर्धारित नहीं किया जा सकता है?) – user2141650

+0

@ user2141650: 'सर्वर' को डेटास्टोर (एक दस्तावेज़ स्टोर सेवा) से यह जानकारी मिलती है। यह सेवा को कॉल करता है और सेवा सामग्री-प्रकार और बाइट स्ट्रिंग के साथ प्रतिक्रिया देती है। मुझे पता है कि मैं प्रत्येक सामग्री-प्रकार (या अधिकांशतः उपयोग किए जाने वाले लोगों) के लिए एक अंतिम बिंदु बना सकता हूं और पहले सामग्री-प्रकार भेज सकता हूं और फिर ग्राहक को सामग्री-प्रकार से संबंधित अंतिम बिंदु का उपयोग करने के लिए कह सकता हूं। यह इतना बुरा हैक है, इस तर्क को क्लाइंट में ले जा रहा है, मुझे लगता है कि इसे सर्वर द्वारा बेहतर तरीके से संभाला जाना चाहिए। – Ecognium

उत्तर

3

यह संभव है, लेकिन एक हैक का एक सा:

{-# 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 आदि के लिए कुछ अतिरिक्त पैर काम करना होगा। यह देखते हुए, आप इसके बारे में अधिक संपूर्ण समर्थन के लिए रेपो में कोई समस्या खोलना चाह सकते हैं।

+0

आपको बहुत बहुत धन्यवाद। यह वास्तव में काम करता है। मैं 'नौकर-दस्तावेज़' का उपयोग कर रहा हूं और मुझे टाइप त्रुटियां मिल रही हैं। आप पहले ही जानते थे कि यह एक मुद्दा होगा। सुनिश्चित नहीं है कि मुझे '' [] 'का उपयोग करने के लिए दस्तावेज़ों को संतुष्ट करने के लिए क्या प्रदान करना है। मुझे जो त्रुटि मिलती है वह 'Servoc.API.ContentTypes.IsNonEmpty' []) को 'Doc.docs' के उपयोग से उत्पन्न नहीं कर सका। मैं एक मुद्दा खोलूंगा और देख सकता हूं कि दस्तावेज़ों के मुद्दे को हल करने का कोई साफ तरीका है या नहीं। – Ecognium

+0

मैंने इसे दस्तावेज़ों के साथ काम किया। '' [] 'का उपयोग करने के बजाय मैंने अभी एक सामान्य कस्टम माइम प्रकार का उपयोग किया है। स्वीकार्य इंस्टेंस की सामग्री-प्रकार 'ऑलसीटेंडर' द्वारा ओवरराइड हो रही है ताकि यह अच्छी तरह से काम कर सके।इस तरह मैं दस्तावेज़ों का उपयोग करने और कस्टम माइम प्रकार वापस करने में सक्षम हूं। – Ecognium

संबंधित मुद्दे