Android 为什么';将数据过帐到表单时,HttpClient工作,但HttpUrlConnenction工作

Android 为什么';将数据过帐到表单时,HttpClient工作,但HttpUrlConnenction工作,android,cookies,httpclient,httpurlconnection,urlconnection,Android,Cookies,Httpclient,Httpurlconnection,Urlconnection,我正在构建一个android应用程序,它应该在我的站点上执行GET操作,以获取两个cookie,然后使用这些cookie向同一站点发送帖子 如前所述,我从GET开始,使用org.apache.http.client.HttpClient来执行此操作 String requiredCookies = ""; HttpContext localContext = null; System.out.println("------------------GET---------------------

我正在构建一个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---------------------");
现在发生的是,我使用存储cookie的localContext执行POST。这不管用。我得到一个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---------------------");

中提琴a 200展示了出来,一切都像一个魔咒。你们觉得怎么样?有人能给我一个答案吗,因为我想不出来。

问题似乎是您的设置中有两个不同的主机名。这将导致HTTP客户端不为其他主机发送cookie。您可以尝试更改cookie存储中cookie的域,或者使用同一主机进行GET和POST。此外,您还可以像在HttpURLConnection示例中那样,手动将cookie添加到HTTP客户端的头中。

我想您在两个请求中使用了两个完全不同的域是一个错误,即您试图屏蔽您的真实URL?如果没有,那就是为什么你没有得到任何饼干。如果你只是想屏蔽你的URL,那就是存在的原因。:)

或者,这与我上周编写的代码完全不同——它在多个GET、POST和子域中运行良好:

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

i、 我显式地使用了一个
DefaultHttpClient
,我相信它为cookie存储提供了额外的get/setter。我想我也没有使用任何上下文对象。

Cookie如何跨不同的域工作?是的,这就是问题所在。为了解决这个问题,我更改了cookies的域。谢谢
DefaultHttpClient httpClient = new DefaultHttpClient();
CookieStore cookieJar = new BasicCookieStore();
httpClient.setCookieStore(cookieJar);