2016-08-09 161 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