我正在构建一个Android应用程序,该应用程序应该在我的网站上执行GET以获取两个cookie,然后使用这些cookie对同一站点执行发布。
如上所述,我开始使用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 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 200,一切都像魅力一样。你们有什么感想?有人可以给我一个答案,因为我无法理解。
答案 0 :(得分:2)
问题似乎是您在设置中有两个不同的主机名。这将导致HTTP客户端不为其他主机发送cookie。您可以尝试更改cookie存储中的cookie域,或使用相同的主机进行GET和POST。此外,您可以像在HttpURLConnection示例中一样手动将cookie添加到HTTP客户端中的标头。
答案 1 :(得分:0)
我猜你在两个请求中使用了两个完全不同的域,这是一个错误 - 即你试图屏蔽你的真实网址?如果没有,那就是你没有得到任何cookie的原因。如果只是试图掩盖您的网址,那就是example.com存在的原因。 :)
或者,这完全脱离了我上周编写的代码 - 它在多个GET,POST和子域中运行良好:
DefaultHttpClient httpClient = new DefaultHttpClient();
CookieStore cookieJar = new BasicCookieStore();
httpClient.setCookieStore(cookieJar);
即。我明确地使用了DefaultHttpClient
,我认为它为cookie商店提供了额外的get / setter。我认为我也没有使用任何上下文对象。