2011-01-15 7 views
3

POSTメソッド(Apacheからのhttpclient)を使用してWebサイトにログオンします。 私は、HttpClientをHttpPostを実行させ、接続マネージャーがそれを解放させ、次にpdfをダウンロードするためにphp-URLファイルを開くGETメッセージをポストしたいとします。 しかし、私が得るすべてはのhtmlファイル「セッション期限切れ」ページ (のprintln:File: index_GT_neu.html?fehlermeldung=fehler_sessioncheck)であるJava HTTPクライアントがウェブサイトにログインしてファイルをダウンロードする - セッションの問題!

私はサイトにログオンするためのHttpClientのインスタンスを使用したら、私は開くことができるだろうと考えていましたログオン後にのみ使用可能な別のURL。しかし、明らかに私は間違っていた。 誰かが私にヒントを与えることができますか? ありがとうございます!

// 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

ワイヤロギングを有効にして(http://hc.apache.org/httpcomponents-client-ga/logging.html#Wire_Logging)、POSTで受信したものと同じCookieをGETとともに送信していることを確認します。 – fglez

+0

サーバーのログ記録の仕組みは?セッション、クッキー? – Harry

答えて

0

私はこのライブラリに精通していないですが、ポストを呼び出す前にコンテキストを作成してみてくださいとGETのために同じコンテキストの再利用:

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

いいえ、それは動作しません。しかし、とにかくおかげさまで、あなたの助けに感謝! – tzippy

+0

私はこの例を見ました:http://stackoverflow.com/questions/678630/how-do-i-make-an-http-request-using-cookies-on-android。 HttpClientは、セッション情報を持っていなければなりません。ポストを消費した後にセッションCookieが含まれているかどうかを確認してください。また、投稿からの応答からSystem.outをコメントアウトしてみてください。一度しか消費できない入力ストリームを消費する可能性があります。ここでは完全に推測しています。 – jny

+0

その両方を試してみました。 POST後にCookieが作成されます。しかし、私はまだセッションチェックエラーを取得します。多分私はPHPのgetfileのURLを呼び出すしようとしているURLと関係がありますか?しかし、これはセッションエラーにつながるべきではありませんか? – tzippy

1

これは私のメインのルックスが好きなものです既定では、DefaultHttpClientにはCookieストアがありません。 Cookieストアは、最初に設定されたCookie、またはHTTPクライアントとの対話中に取得されたCookieを保存するために必要です。このトピックを掘り下げたらすぐに、Cookieのスコープ/共有について考えるようになります。

あなたは、コードの1行追加してCookieストア有効にすることができます:私は知っている

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

を、これは少し遅く、まだHTHかもしれません。

関連する問題