Pregunta

Estoy construyendo una aplicación para Android que debe realizar un GET en mi sitio para obtener dos galletas y luego realizar un post para el mismo sitio con estas galletas.

Como se mencionó comienzo de la GET y estoy usando org.apache.http.client.HttpClient para realizar esta operación.

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

Hasta aquí todo bien. No importa la línea requiredCookies sin embargo, se utiliza en los impl Java.net ya que no puedo conseguir el HttpClient uno a trabajar = (. Vamos a echar un vistazo a la no trabajo HttpClient Mensaje parte.

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

Lo que sucede ahora es que puedo realizar un post con el localContext donde se almacenan las cookies. Esto no funciona. Consigo un HTTP / 1.1 401 No sesión. Como no tenía suerte con este Probé otro enfoque (java.net.HttpURLConnection). Recuerdo todavía utilizo la misma parte 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---------------------");

y Viola se muestra un 200 y todo funciona a las mil maravillas. ¿Qué piensan ustedes? Podría alguien por favor me dan una respuesta porque no puedo entenderlo.

¿Fue útil?

Solución

El problema parece ser que tiene dos diferentes nombres de host en la configuración. Esto provocará cliente HTTP para que no envíe cookies para un host diferente. Usted podría intentar cambiar el dominio de las cookies en la tienda de galletas, o el uso de la misma máquina para GET y POST. Además se puede añadir manualmente las cookies para las cabeceras HTTP en el cliente como lo hizo en el ejemplo HttpURLConnection.

Otros consejos

Creo que fue un error que utilizó dos dominios completamente diferentes para sus dos peticiones - es decir, que estaba tratando de ocultar su verdadera dirección URL? Si no es así, es por eso que no está recibiendo ninguna cookie. Si se acaba de tratar de ocultar su URL, así que por eso example.com existe. :)

Por otra parte, y esto es completamente fuera de la parte superior de la cabeza de un código que escribí la semana pasada - funcionó bien a través de múltiples GET, POST y subdominios:

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

es decir. Estoy explícitamente el uso de un DefaultHttpClient, que creo que tiene esos tipo get / set extra para la tienda de galletas. Creo que no he utilizado ningún contexto objetos tampoco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top