Tôi đang cố gắng chuyển tiếp một số ByteString
quay lại máy khách (trình duyệt). Khách hàng sẽ không biết loại nội dung của tài liệu đang được yêu cầu vì vậy tôi đang cố gửi phản hồi kiểu nội dung thích hợp cho khách hàng. Tài liệu có thể là hình ảnh hoặc pdf hoặc tài liệu từ, v.v.Gửi loại nội dung chung trong Servant
Ví dụ: khách hàng sẽ yêu cầu /document?id=55
và máy chủ sẽ phản hồi với loại nội dung thích hợp và liên kết ByteString
.
Tôi đã làm theo ví dụ here: và tôi đã tạo thứ gì đó cho hình ảnh.
data IMAGE
instance Accept IMAGE where
contentType _ = "image" M.// "jpeg"
instance MimeRender IMAGE LBS.ByteString where
mimeRender _ = id
Thách thức là khách hàng sẽ không được gửi yêu cầu với một số Accept:
tiêu đề cụ thể như vậy không có cách nào cho tôi phản ứng với một Mime Type thích hợp như nó được thực hiện here. Plus ở trên sẽ chỉ làm việc cho hình ảnh (giả sử trình duyệt sẽ suy ra một png
thậm chí tôi gửi lại jpeg
) nhưng không cho pdf
, docx
, v.v.
Tôi đã nghĩ về loại tham số như MyDynamicContent String
và tôi sẽ chuyển loại nội dung vào thời gian chạy nhưng tôi không chắc chắn cách khai báo API của mình, tôi sẽ sử dụng cái gì thay vì '[JSON]
. Bạn không chắc chắn điều đó thậm chí có thể là các ví dụ chỉ là một kiểu dữ liệu đơn giản.
Vì vậy, câu hỏi của tôi là, nếu tôi muốn gửi một số ByteString
như một phản ứng và thiết lập Content-Type
tiêu đề tự động, điều gì sẽ là cách tốt nhất để làm điều đó bằng servant
Cập nhật: Tôi đã mở một issue
Máy chủ quyết định loại nội dung nào sẽ phản hồi? (Cụ thể, chỉ để chắc chắn, điều này không thể được xác định tĩnh?) – user2141650
@ user2141650: Máy chủ 'nhận thông tin này từ kho dữ liệu (dịch vụ lưu trữ tài liệu). Nó thực hiện cuộc gọi đến dịch vụ và dịch vụ đáp ứng với kiểu nội dung và cũng là chuỗi byte. Tôi biết tôi có thể tạo điểm kết thúc cho từng loại nội dung (hoặc ít nhất là sử dụng) và gửi kiểu nội dung trước rồi yêu cầu khách hàng sử dụng điểm cuối tương ứng với loại nội dung. Đây là một hack xấu, di chuyển rất nhiều logic này cho khách hàng, tôi cảm thấy nó sẽ được xử lý tốt hơn bởi máy chủ. – Ecognium