2011-01-15 4 views
3

Ich logge mich auf einer Website mit der POST-Methode (httpclient von Apache). Ich lasse den HttpClient den HttpPost ausführen, lasse ihn vom Verbindungsmanager freigeben und dann möchte ich eine GET-Nachricht posten, die eine PHP-URL-Datei öffnet, um eine PDF herunterzuladen. Aber alles, was ich bekomme, ist die HTML-Datei einer „Sitzung abgelaufen“ Seite (println: File: index_GT_neu.html?fehlermeldung=fehler_sessioncheck)Java httpclient, um sich in die Website einzuloggen und eine Datei herunterzuladen - Sitzungsprobleme!

Ich dachte, dass ich einmal die Instanz von Httpclient verwendet, bei der Site anmelden, würde ich in der Lage sein, zu öffnen eine andere URL, die nur nach dem Anmelden verfügbar ist. Aber anscheinend lag ich falsch. Jemand könnte mir einen Hinweis geben? Vielen Dank im Voraus!

Dies ist, was mein Haupt aussieht:

// prepare post method 
    HttpPost post = new HttpPost("http://epaper02.niedersachsen.com/epaper/index_GT_neu.html"); 

    //prepare get method 
    HttpGet httpget = new HttpGet("http://epaper01.niedersachsen.com/epaper/getfile.php?pdf=0114_GTB_HP_01.pdf&zeitung=GT&ekZeitung=&Y=11&M=01&D=14&C=0"); 

    // add parameters to the post method 
    List <NameValuePair> parameters = new ArrayList <NameValuePair>(); 
    parameters.add(new BasicNameValuePair("username", "test")); 
    parameters.add(new BasicNameValuePair("passwort", "test")); 
    UrlEncodedFormEntity sendentity = new UrlEncodedFormEntity(parameters, HTTP.UTF_8); 
    post.setEntity(sendentity); 

    // create the client and execute the post method 
    HttpClient client = new DefaultHttpClient(); 
    HttpResponse postResponse = client.execute(post); 

    //Output the Response from the POST 
    System.out.print(convertInputStreamToString(postResponse.getEntity().getContent())); 

    //releasing POST 
    EntityUtils.consume(postResponse.getEntity()); 

    //Execute get 
    HttpContext context = new BasicHttpContext(); 
    HttpResponse getResponse = client.execute(httpget, context); 
    System.out.println("Statusline: " + getResponse.getStatusLine()); 

    if (getResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) 
     throw new IOException(getResponse.getStatusLine().toString()); 
    HttpUriRequest currentReq = (HttpUriRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST); 
    String currentUrl = URLDecoder.decode(currentReq.getURI().toString(), "UTF-8"); 

    int i = currentUrl.lastIndexOf('/'); 
    String fileName = null; 
    if (i < 0) { 
     fileName = currentUrl; 
    } else { 
     fileName = currentUrl.substring(i + 1); 
    } 
    System.out.println("File: " + fileName); 

    //Create file 
    OutputStream os = new FileOutputStream(fileName); 
    InputStream is = getResponse.getEntity().getContent(); 
    byte[] buf = new byte[4096]; 
    int read; 
    while ((read = is.read(buf)) != -1) { 
     os.write(buf, 0, read); 
    } 
    os.close(); 

    client.getConnectionManager().shutdown(); 
+1

Aktivieren Sie die Drahtprotokollierung (http://hc.apache.org/httpcomponents-client-ga/logging.html#Wire_Logging) und prüfen Sie, ob Sie mit GET dieselben Cookies senden, die Sie mit POST erhalten. – fglez

+0

Wie protokolliert der Server Benutzer? Sitzungen, Cookies? – Harry

Antwort

0

ich mit dieser Bibliothek nicht vertraut bin, sondern versuchen, Kontext zu schaffen, bevor die Post und die Wiederverwendung der gleichen Kontext für den get Aufruf:

HttpContext context = new BasicHttpContext(); 
    // create the client and execute the post method 
    HttpClient client = new DefaultHttpClient(); 
    HttpResponse postResponse = client.execute(post,context); 
    ... 

    HttpResponse getResponse = client.execute(httpget, context); 
+0

Nein, das funktioniert nicht. Aber danke trotzdem, schätze deine Hilfe! – tzippy

+0

Ok, ich habe mir dieses Beispiel angeschaut: http: //stackoverflow.com/questions/678630/how-do-i-make-an-http-request-using-cookies-on-android. HttpClient sollte Sitzungsinformationen haben, überprüfen Sie, ob es Sitzungscookies enthält, nachdem Sie den Beitrag konsumiert haben. Versuchen Sie auch, System.out aus der Antwort des Posts auszukommentieren. Sie könnten einen Input-Stream konsumieren, der nur einmal konsumiert werden kann - und dabei absolut raten. – jny

+0

Versucht, dass beide. Ein Cookie wird nach dem POST erstellt. Aber ich bekomme immer noch den Sessioncheck-Fehler. Vielleicht hat es mit der URL zu tun, die ich als php getfile URL aufrufen möchte? Aber sollte dies nicht zu einem Sitzungsfehler führen, oder? – tzippy

1

Standardmäßig verfügt DefaultHttpClient über keinen Cookie-Speicher. Ein Cookie-Speicher wird benötigt, um Cookies zu speichern, die anfänglich ausgefüllt wurden oder die während der Interaktion mit dem HTTP-Client erhalten wurden. Sobald Sie sich mit diesem Thema beschäftigen, werden Sie über den Umfang/das Teilen von Cookies nachdenken.

Sie können den Cookie-Shop mit einem zusätzlichen Codezeile aktivieren:

DefaultHttpClient client = new DefaultHttpClient(); 
client.setCookieStore(new BasicCookieStore()); 

Ich weiß, könnte dies ein wenig zu spät, noch HTH.

Verwandte Themen