2016-08-09 1 views
0

Sagen, ich möchte zwei Anfragen stellen. Der erste sendet Anmeldeinformationen an den Server und der zweite ruft einige Daten ab, die eine Authentifizierung erfordern.Sitzungen mit http-Client

Gibt es etwas Besonderes, um dieses Verhalten mit http-client zu bekommen? Die Art und Weise, wie es mit wreq funktionierte, besteht darin, denselben Wert Session in beiden Anfragen zu teilen. Die Cookies und alles wurde automatisch bearbeitet.

Ich nahm an, das gleiche wäre wahr mit http-client, wenn ich die gleiche Manager teile, aber das scheint nicht der Fall zu sein. Ich bekomme eine Antwort darauf, dass ich nicht eingeloggt bin.

Leider kann ich aus verschiedenen Gründen nicht wirklich ein kompilierbares Codebeispiel bereitstellen.

+0

@ MB21 Es ist nur ein Reader um einen Manager gewickelt. Wenn das ein Hinweis darauf ist, dass das Teilen des Managers alles sein sollte, was benötigt wird, dann denke ich, dass mein Problem woanders ist. –

+1

Haben Sie den Abschnitt zu [Cookies] (https://hackage.haskell.org/package/http-client-0.5.1/docs/Network-HTTP-Client.html#g:14) gelesen? –

+0

@RowanBlush Ich tat es aber es sagt nicht, ob ich die Keksdose manuell oder was aktualisieren sollte. –

Antwort

3

Es sieht so aus, als ob Sie die Keksdose selbst mit den Funktionen createCookieJar, updateCookieJar und insertCookiesIntoRequest verwalten müssen.

Einige Beispiel-Code:

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