如何使用Network.HTTP.receiveHTTP在Haskell中编写简单的HTTP服务器
模块 公开我想用于非常基本的web服务器的函数如何使用Network.HTTP.receiveHTTP在Haskell中编写简单的HTTP服务器,http,haskell,Http,Haskell,模块 公开我想用于非常基本的web服务器的函数receiveHTTP和respondHTTP。我编写了一个只等待客户端的存根: {-# LANGUAGE OverloadedStrings #-} module Main where import Network.HTTP import Network import Control.Monad main = withSocketsDo $ do socket <- listenOn $ PortNumber 8080 forev
receiveHTTP
和respondHTTP
。我编写了一个只等待客户端的存根:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Network.HTTP
import Network
import Control.Monad
main = withSocketsDo $ do
socket <- listenOn $ PortNumber 8080
forever $ do
(handle, host, port) <- accept socket
print (host, port)
{-#语言重载字符串}
模块主要在哪里
导入网络.HTTP
导入网络
进口管制
main=带库存的订单$do
socket也许它希望您使用而不是网络
?这将为您提供一个套接字
,而不是句柄
,您应该能够将其转换为receiveHTTP
可以使用的表单
通常,直接使用句柄
会更好,但在这里,HTTP库为您处理它,因此它希望使用较低级别的接口
编辑:进一步查看后,似乎网络中的socketConnection
功能可以满足您的需要。有趣的是,它实际上是在内部将套接字制作成句柄
,然后再从中读取,但似乎没有提供从外部提供的句柄
读取的方法。函数的字符串参数应该是远程主机的名称,但它看起来只是作为参考保存的;它实际上并没有启动到该主机的连接或其他任何操作。您可以这样做,但我真的认为您不应该这样做HTTP
可以用作服务器,但设计用于客户端。我在谷歌上搜索了一下,没有找到任何人实际使用respondHTTP
的例子。如果您在2016年使用客户端HTTP,请使用。在服务器端,或者依赖于它的东西可能就是您想要的
不过,代码是这样的
#!/usr/bin/env stack
-- stack --resolver lts-6.3 --install-ghc runghc --package HTTP
{-# LANGUAGE RecordWildCards #-}
import Control.Monad
import qualified Data.ByteString as B
import Network.HTTP
import Network.Socket
import Network.URI
main = do
lsock <- socket AF_INET Stream defaultProtocol
bind lsock (SockAddrInet 8080 iNADDR_ANY)
listen lsock 1
forever $ do
(csock, _) <- accept lsock
hs <- socketConnection "" 8080 csock
req <- receiveHTTP hs
case req of
Left _ -> error "Receiving request failed"
Right (Request {..}) -> if uriPath rqURI == "/"
then do
respondHTTP hs $
Response (2,0,0) "OK" [] "Hello HTTP"
Network.HTTP.close hs
else do
respondHTTP hs $
Response (4,0,4) "Not found" [] "Nothing here"
Network.HTTP.close hs
#/usr/bin/env堆栈
--堆栈--解析器lts-6.3--安装ghc runghc--包HTTP
{-#语言记录通配符}
进口管制
将限定数据.ByteString作为B导入
导入网络.HTTP
导入网络套接字
导入Network.URI
main=do
lsock我不能直接回答这个问题,但是你可以找到一些有用的例子。