【问题标题】:Why doesn't HttpClient work but HttpUrlConnenction do when posting data to form为什么在将数据发布到表单时 HttpClient 不起作用但 HttpUrlConnenction 起作用
【发布时间】:2010-01-13 20:08:59
【问题描述】:

我正在构建一个 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 无会话。由于我没有运气,我尝试了另一种方法(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,一切都像魅力一样。你们有什么感想?谁能给我一个答案,因为我无法弄清楚。

【问题讨论】:

  • cookie 如何跨域工作?

标签: android cookies httpclient httpurlconnection urlconnection


【解决方案1】:

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

【讨论】:

  • 是的,这就是问题所在。为了解决这个问题,我更改了 cookie 的域。谢谢。
【解决方案2】:

我猜你为你的两个请求使用了两个完全不同的域是一个错误——即你试图掩盖你的真实 URL?如果没有,那么这就是您没有收到任何 cookie 的原因。如果只是试图掩盖您的 URL,那么这就是 example.com 存在的原因。 :)

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

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

即我明确地使用了DefaultHttpClient,我相信它有那些用于cookie 存储的额外get/setter。我也不认为我使用了任何上下文对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2019-12-29
    • 2016-08-11
    • 1970-01-01
    • 2014-01-26
    • 2013-08-13
    相关资源
    最近更新 更多