2016-08-09 160 views
0

假设我想提出两个请求。第一个发送登录信息到服务器,第二个检索一些需要认证的数据。http客户端会话

有什么特别的我需要做的,以获得http-client此行为?它与wreq合作的方式是通过在两个请求中共享相同的Session值。饼干和一切都自动处理。

我认为如果我分享相同的Manager,但http-client也是如此,但似乎并非如此。我收到一个回应,表示我没有登录。

不幸的是,我不能真正提供一个可编译的代码样本,因为各种原因。

+0

@ MB21这只是围绕一个经理包裹读者。如果这意味着分享经理应该是所有需要的,那么我想我的问题在别的地方。 –

+1

您是否看到[cookies]部分(https://hackage.haskell.org/package/http-client-0.5.1/docs/Network-HTTP-Client.html#g:14)? –

+0

@RowanBlush我做了,但没有说我是否应该手动更新cookie jar或什么。 –

回答

3

它看起来像你必须自己用功能createCookieJar,updateCookieJarinsertCookiesIntoRequest管理饼干罐。

一些示例代码:

import Network.HTTP.Client 
import Network.HTTP.Types.Status (statusCode) 
import Data.Time.Clock 

main :: IO() 
main = do 
    manager <- newManager defaultManagerSettings 

    now1 <- getCurrentTime 
    request1 <- parseRequest "http://cnn.com" 
    response1 <- httpLbs request1 manager 

    putStrLn $ "The status code was: " ++ (show $ statusCode $ responseStatus response1) 
    -- print $ responseBody response 

    let (jar1, _) = updateCookieJar response1 request1 now1 (createCookieJar []) 
    putStrLn $ "new jar: " ++ show jar1 

    req2 <- parseRequest "http://cnn.com" 
    now2 <- getCurrentTime 
    let (request2, jar2) = insertCookiesIntoRequest req2 jar1 now2 

    response2 <- httpLbs request2 manager 

    putStrLn $ "\nThe status code was: " ++ (show $ statusCode $ responseStatus response2) 
    -- print $ responseBody response2