微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Network.HTTP.receiveHTTP在Haskell中编写简单的HTTP服务器

如何解决如何使用Network.HTTP.receiveHTTP在Haskell中编写简单的HTTP服务器

|| 模块
Network.HTTP
公开了我想用于非常基本的Web服务器的功能
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)
这里的
accpet
给了我
Handle
,现在我不知道如何将
Handle
receiveHTTP
一起使用。 我在Google上找到了一个示例,但这是从2008年开始的,不再起作用。而且我无法移植它。 有任何想法吗?     

解决方法

        您可以执行此操作,但我真的认为您不应该这样做。
HTTP
可以充当服务器,但旨在用于客户端。我用Google搜索了一下,但找不到任何实际使用
respondHTTP
的例子。如果您在2016年使用客户端HTTP,请使用ѭ10。在服务器端,ѭ11或其他依赖于它的东西可能就是您想要的。 不过,这是代码。
#!/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) \"OK\" [] \"Hello HTTP\"
                              Network.HTTP.close hs
                            else do
                              respondHTTP hs $
                                Response (4,4) \"Not found\" [] \"Nothing here\"
                              Network.HTTP.close hs
上面使用了Stack对shebang脚本的支持。
chmod +x
或以
stack foo.hs
运行。 ѭ15模块已弃用。如果需要套接字API,请始终使用ѭ16。对于更高级别的内容,请使用
connection
。 您可以执行普通的POSIX套接字操作,然后将连接的套接字转换为带有ѭ19的
HandleStream
并在其上运行
respondHTTP
receiveHTTP
socketConnection
是一个怪异的功能。前两个参数是运行服务器时不使用AFAICT的主机名和端口。 我用
RecordWildCards
扩展名。它使我可以用模式写
Right (Request {..})
,并将记录的所有字段都放在右侧的范围内。     ,        也许它希望您使用
Network.Socket
中的
accept
函数而不是
Network
?这将使您获得一个
Socket
而不是
Handle
,您应该能够将其转换为
receiveHTTP
可以使用的形式。 通常,直接使用ѭ5会更好一些,但是在这里HTTP库为您处理了它,因此它希望使用较低级别的接口。 编辑:进一步研究后,似乎
Network.TCP
中的
socketConnection
函数可以满足您的需求。有趣的是,它实际上是在从套接字读取之前在内部将其插入一个ѭ5插座,但似乎没有提供从外部提供的read5插座进行读取的方法。该函数的字符串参数应该是远程主机的名称,但看起来只是作为参考;实际上并没有启动与该主机或其他任何设备的连接。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。