我试图对Scotty进行测试,以测试网络I/O效率和整体吞吐量.
为此,我设置了两个用Haskell编写的本地服务器.一个不做任何事情而只是充当API的人.
代码相同
{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Network.Wai.Middleware.RequestLogger
import Control.Monad
import Data.Text
import Control.Monad.Trans
import Data.ByteString
import Network.HTTP.Types (status302)
import Data.Time.Clock
import Data.Text.Lazy.Encoding (decodeUtf8)
import Control.Concurrent
import Network.HTTP.Conduit
import Network.Connection (TLSSettings (..))
import Network.HTTP.Client
import Network
main = do
scotty 4001 $ do
middleware logStdoutDev
get "/dummy_api" $ do
text $ "dummy response"
Run Code Online (Sandbox Code Playgroud)
我写了另一个调用此服务器并返回响应的服务器.
{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Network.Wai.Middleware.RequestLogger
import Control.Monad
import Control.Monad.Trans
import qualified Data.Text.Internal.Lazy as LT
import Data.ByteString
import Network.HTTP.Types (status302)
import …
Run Code Online (Sandbox Code Playgroud) 为什么这么简单的代码不起作用?
import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L
main :: IO ()
main = simpleHttp "http://www.dir.bg/" >>= L.putStr
Run Code Online (Sandbox Code Playgroud)
它会导致以下错误:
TestConduit.exe:InternalIOException getAddrInfo:不存在(错误10093)
我正在尝试使用HTTPS从网站上抓取数据.我成功地使用Network.HTTP.Conduit发布基本请求(发布凭据等),但是无法从响应头(Set-Cookie)中提取cookie信息.貌似http-conduit有自己的处理cookie 的机制,我无法理解.
Network.HTTP.Conduit.Browser似乎自动处理cookie(我很好),但由于缺少文档,我无法使用它.
有经验处理http-conduit浏览器模块的人可以告诉我如何:
对我来说,看起来Network.HTTP.Conduit.Browser的抽象级别比Network.HTTP.Conduit更适合我的应用程序,所以即使我可以使用后者手动处理cookie,我也想进行切换.
我正在尝试下载html文件中包含的所有png文件.我很难捕获404状态异常,而我的程序只是崩溃了.
以下是一些示例:
import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L
main = do
let badUrl = "http://www.google.com/intl/en_com/images/srpr/WRONG.png"
imgData <- (simpleHttp badUrl) `catch` statusExceptionHandler
L.writeFile "my.png" imgData
statusExceptionHandler :: t -> IO L.ByteString
statusExceptionHandler e = (putStrLn "oops") >> (return L.empty)
Run Code Online (Sandbox Code Playgroud)
我的"oops"消息从不打印,而是应用程序崩溃:
StatusCodeException(Status {statusCode = 404,statusMessage ="Not Found"})[("Content-Type","text/html; charset = UTF-8"),("X-Content-Type-Options","nosniff "),("日期","星期五,2012年1月27日03:10:34 GMT"),("服务器","sffe"),("内容长度","964"),("X-XSS -Protection","1; mode = block")]
我究竟做错了什么?
更新:
根据Thoma的建议,我将代码更改为以下代码段,现在已经适当地处理了异常处理.
main = do
let badUrl = "http://www.google.com/intl/en_com/images/srpr/WRONG.png"
imgData <- (simpleHttp badUrl) `X.catch` statusExceptionHandler
case imgData of x | x == L.empty -> …
Run Code Online (Sandbox Code Playgroud) 我无法让这个导入在haskell中工作.
import Network.HTTP.Conduit
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我收到以下错误:
$ ghc Play.hs
Play.hs:1:8:
Could not find module `Network.HTTP.Conduit'
Use -v to see a list of the files searched for.
Run Code Online (Sandbox Code Playgroud)
如果我尝试在GHCI中加载文件,则会发生同样的错误.
我已通过cabal安装了最新版本的http-conduit.这是cabal的输出:
$ cabal -list http-conduit
* http-conduit
Synopsis: HTTP client package with conduit interface and HTTPS support.
Default available version: 1.8.2
Installed versions: 1.6.0.4, 1.8.2
Homepage: http://www.yesodweb.com/book/http-conduit
License: BSD3
* http-conduit-browser
Synopsis: Browser interface to the http-conduit package
Default available version: 1.6.3
Installed versions: 1.6.3
Homepage: https://github.com/exbb2/http-conduit-browser
License: BSD3
Run Code Online (Sandbox Code Playgroud)
如果它可能有所作为,我使用的是Ubuntu 12.04.
任何想法为什么这不会导入?
编辑:'ghc-pkg list'的输出:
$ …
Run Code Online (Sandbox Code Playgroud) 我使用http-conduit
库版本2.0+从http://
URL 获取内容:
import Network.HTTP.Conduit
myurl = ... -- Your URL goes here
main = do content <- simpleHttp myurl
print $ content
Run Code Online (Sandbox Code Playgroud)
运行此程序时,我收到此错误:
*** Exception: TlsException (HandshakeFailed (Error_Protocol
("certificate rejected: certificate is not allowed to sign another certificate",
True,CertificateUnknown)))
Run Code Online (Sandbox Code Playgroud)
从错误消息中可以看出,问题是无法Network.HTTP.Conduit
正确验证服务器证书(在这种情况下,证书链中似乎存在问题)
如何更改上面的代码以忽略证书错误(即根本不验证证书)?
我明白 "." (点)作为功能组合.我理解"|" (管道)作为"或",警卫介绍语法(从这里 ),但我在http-conduit上看到了一个使用".|"的答案.以我不理解的方式使用此运算符.
我发现的其他管道参考,例如:
...建议语法如"$$","$ =","= $ =","= $"用于组合数据流中的管道.
我该怎么称呼这个".|" 这个运算符,它是如何工作的?
可以预见的是,Google搜索".| haskell"或"'dot pipe'haskell"或"'dot pipe'haskell运营商管道"并不是很成功.
我有一个现有的程序,它接受命令行参数(用户名,密码,日期),然后使用该Network.HTTP.Conduit
库将xml消息发布到服务器.然后我解析结果,做一些工作并使用blaze-html写出文件.
这一切都像一个魅力; 但是,我以为我会使用haskeline
密码不可见.我能够创建一个命令行程序来获取用户提供的值并打印出来,但是如果我调用使用管道的函数,它就永远不会返回.
这是违规代码:
main = runInputT defaultSettings loop
where
loop :: InputT IO ()
loop = do
Just username <- getInputLine "WM username: "
Just password <- getPassword (Just '*') "WM password: "
Just date <- getInputLine "Date (YYYYMMDD): "
outputStrLn "querying WM..."
clients <- lift $ getWMClients username password
outputStrLn "successfully retrieved client list from WM..."
let outHeader = renderHeader date username
reportString <- mapM (\x -> createString x clients) cList
lift $ writeFile …
Run Code Online (Sandbox Code Playgroud) 有关于如何在Haskell中下载大文件的任何建议吗?我认为Http.Conduit是这个库是一个很好的库.但是,它是如何解决这个问题的?它的文档中有一个例子,但它不适合下载大文件,它只是下载一个文件:
import Data.Conduit.Binary (sinkFile)
import Network.HTTP.Conduit
import qualified Data.Conduit as C
main :: IO ()
main = do
request <- parseUrl "http://google.com/"
withManager $ \manager -> do
response <- http request manager
responseBody response C.$$+- sinkFile "google.html"
Run Code Online (Sandbox Code Playgroud)
我想要的是能够下载大文件而不是用完RAM,例如在性能方面做得有效等等.最好能够"继续"下载它们,意思是"现在某个部分,后来的另一个部分" .
我还发现了hackage上的download-curl软件包,但我并不认为这是一个很好的选择,甚至可以像我需要的那样通过chunk下载文件块.
此功能(使用httpLBS)有效:
makeRequest = do
response <- httpLBS "http://httpbin.org/get"
putStrLn $ "The status code was: " ++ show (getResponseStatusCode response)
Run Code Online (Sandbox Code Playgroud)
但是这个函数(使用httpJSON)不会:
makeRequest = do
response <- httpJSON "http://httpbin.org/get"
putStrLn $ "The status code was: " ++ show (getResponseStatusCode response)
Run Code Online (Sandbox Code Playgroud)
它抛出错误:
Ambiguous type variable `a0' arising from a use of `httpJSON' prevents the constraint
`(aeson-1.1.2.0:Data.Aeson.Types.FromJSON.FromJSON a0)' from being solved.
Probable fix: use a type annotation to specify what `a0' should be.
Run Code Online (Sandbox Code Playgroud) haskell ×10
http-conduit ×10
conduit ×3
http ×2
https ×2
networking ×2
benchmarking ×1
haskeline ×1
scotty ×1
ssl ×1
web-scraping ×1
windows ×1