我建立这应该在我的网站进行GET获得两个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行了,它会在Java.net IMPL使用,因为我不能让HttpClient的一个工作=(。 让我们来看看在非工作的HttpClient后的部分。

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---------------------");

什么现在情况是,我执行POST与其中cookie被存储在localContext。这是行不通的。我得到一个HTTP / 1.1 401无会话。由于我没有运气这个我试过另一种方法(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---------------------");

和中提琴200被显示和一切正常就像一个魅力。你们有什么感想?可能有人请我提供一个答案,因为我无法找到答案。

有帮助吗?

解决方案

这个问题似乎是你在建立两个不同的主机名。这将导致HTTP客户端不是一个不同的主机发送cookie。你可以尝试改变的cookie存储的cookie的域,或使用GET和POST在同一台主机。此外你可以手工饼干添加到报头中HTTP客户端与您在HttpURLConnection的示例那样。

其他提示

我想这是你使用了两个完全不同的领域为你的两个请求一个错误 - 即你试图掩盖你真正的网址是什么?如果没有,那么这就是为什么你没有得到任何cookie。如果只是试图掩盖你的网址,以及这就是为什么 example.com 存在。 :)

另外,这完全是我的头从代码的顶部我上周写的 - 它工作得很好跨越多个入眼,职位和子域:

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

即。我明确地使用DefaultHttpClient,我相信这对cookie存储这些额外的get / setter方法。我不认为本人使用任何上下文对象或者

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top