1

サイトで GET を実行して 2 つの Cookie を取得し、これらの Cookie を使用して同じサイトに投稿する Android アプリを作成しています。

前述のように、GET から始めて、この操作を実行するために org.apache.http.client.HttpClient を使用しています。

String requiredCookies = "";
HttpContext localContext = null;

System.out.println("------------------GET----------------------");
HttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet("www.mysitegeturl.com");

//Creating a local instance of cookie store.
CookieStore cookieJar = new BasicCookieStore();

// Creating a local HTTP context
localContext = new BasicHttpContext();

// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieJar);

HttpResponse response;
try {
    response = httpClient.execute(get, localContext);
HttpEntity entity = response.getEntity();
System.out.println(response.getStatusLine());
if (entity != null) {
   System.out.println("Response content length: " + entity.getContentLength());
}

//Do this so that Java.net impl should work
List<Cookie> cookies = cookieJar.getCookies();
for (int i = 0; i < cookies.size(); i++) {
     requiredCookies += cookies.get(i).getName()+"="+cookies.get(i).getValue()+";";
}

if (entity != null) {
    entity.consumeContent();
}

} catch (ClientProtocolException e1) {
        // TODO Auto-generated catch block
 e1.printStackTrace();
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
System.out.println("------------------GET-END---------------------");

ここまでは順調ですね。requiredCookies 行はまだ気にしないでください。HttpClient を =( で動作させることができないため、Java.net impl で使用されます。動作していない HttpClient Post 部分を見てみましょう。

System.out.println("------------------HttpClient - POST----------------------");
HttpPost post = new HttpPost("www.mysiteposturl.com");

//Params       
HttpParams params = new BasicHttpParams();

params.setParameter("foo", "post");
params.setParameter("bar", "90");
params.setParameter("action", "search");

post.setParams(params);
post.setHeader("Content-Type", "application/x-www-form-urlencoded");

try {
    HttpResponse response2 = httpClient.execute(post, localContext);
     System.out.println(response2.getStatusLine());
} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
System.out.println("------------------POST END---------------------");

ここで起こることは、Cookie が保存されている localContext で POST を実行することです。これはうまくいきません。HTTP/1.1 401 No セッションが発生します。これでうまくいかなかったので、別のアプローチ(java.net.HttpURLConnection)を試しました。同じ GET 部分をまだ使用していることを思い出してください

URL url = new URL("www.mysiteposturl");
HttpURLConnection connection = null;

String dataString = "bar=90&foo=post&action=search";

try {
connection = (HttpURLConnection)url.openConnection();
connection.setRequestProperty("Cookie", requiredCookies);
//Set to POST
connection.setDoOutput(true);
Writer writer = new OutputStreamWriter(connection.getOutputStream());
writer.write(dataString);
writer.flush();
writer.close();
connection.connect();

if (connection.getResponseCode() == 200 || connection.getResponseCode() == 201) {
    System.out.println(connection.getContent().toString());
} else {
   System.out.println("Error");
}
} catch (IOException e) {
   // TODO Auto-generated catch block
     e.printStackTrace();
} catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}

System.out.println("------------------POST END---------------------");

そして、VIOLA a 200 が表示され、すべてが魅力的に機能します。皆さんはどう思いますか?わからないので誰か回答お願いします。

4

2 に答える 2

0

2つのリクエストに2つの完全に異なるドメインを使用したのは間違いだったと思います。つまり、実際のURLをマスクしようとしていたのでしょうか。そうでない場合は、それがCookieを取得していない理由です。URLをマスクしようとしただけの場合は、example.comが存在するのはそのためです。:)

あるいは、これは先週書いたコードから完全に頭から離れています—複数のGET、POST、およびサブドメインで正常に機能しました。

DefaultHttpClient httpClient = new DefaultHttpClient();
CookieStore cookieJar = new BasicCookieStore();
httpClient.setCookieStore(cookieJar);

つまり、明示的にを使用していDefaultHttpClientます。これには、Cookieストア用の追加のget/setterがあると思います。コンテキストオブジェクトも使用しなかったと思います。

于 2010-01-13T20:54:21.460 に答える