Почему HttpClient не работает, а HttpUrlConnenction работает при публикации данных в форму - PullRequest
1 голос
/ 13 января 2010

Я создаю приложение для Android, которое должно выполнить GET на моем сайте, чтобы получить два куки, а затем выполнить публикацию на том же сайте с этими куки.

Как уже упоминалось, я начинаю с 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, так как я не могу заставить работать 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---------------------");

Что происходит сейчас, так это то, что я выполняю POST с localContext, где хранятся файлы cookie. Это не работает Я получаю 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 200 отображается, и все работает как шарм. Что, вы парни, думаете? Может ли кто-нибудь, пожалуйста, дать мне ответ, потому что я не могу понять его.

Ответы [ 2 ]

2 голосов
/ 13 января 2010

Проблема заключается в том, что у вас есть два разных имени хоста в настройке. Это приведет к тому, что клиент HTTP не будет отправлять файлы cookie для другого хоста. Вы можете попробовать изменить домен файлов cookie в магазине cookie или использовать один и тот же хост для GET и POST. Кроме того, вы можете вручную добавить файлы cookie в заголовки HTTP-клиента, как вы это делали в примере HttpURLConnection.

0 голосов
/ 13 января 2010

Полагаю, ошибкой было то, что вы использовали два совершенно разных домена для ваших двух запросов & mdash; то есть вы пытались замаскировать свой реальный URL? Если нет, то вот почему вы не получаете куки. Если вы просто пытаетесь замаскировать ваш URL, вот почему существует example.com . :)

В качестве альтернативы, и это полностью вне моей головы из кода, который я написал на прошлой неделе & mdash; он отлично работал на нескольких GET, POST и поддоменах:

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

т.е. Я явно использую DefaultHttpClient, который, как мне кажется, имеет те дополнительные get / setters для магазина cookie. Я не думаю, что я использовал какие-либо объекты контекста либо.

...