2011-11-14 10 views
5

Estoy tratando de usar la API de Reddit para hacer algunas cosas. Tengo todo funcionando, pero cambio de páginas e ingreso.No puedo usar las API de Reddit para iniciar sesión

Necesito iniciar sesión para usar mi programa, sé cómo usar la cookie que obtengo, pero no logro ingresar.

Aquí está el código:

public static Login POST(URL url, String user, String pw) throws IOException 
{ 

    String encodedData = URLEncoder.encode("api_type=json&user=" + user +"&passwd="+pw, "UTF-8"); 
    HttpURLConnection ycConnection = null; 
    ycConnection = (HttpURLConnection) url.openConnection(); 
    ycConnection.setRequestMethod("POST"); 
    ycConnection.setDoOutput(true); 
    ycConnection.setUseCaches (false); 
    ycConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 
    PrintWriter out = new PrintWriter(ycConnection.getOutputStream()); 


    out.print(encodedData.getBytes()); 
    out.close(); 

    BufferedReader in = new BufferedReader(new InputStreamReader(ycConnection.getInputStream())); 
    String response = in.readLine(); 

    Map<String, List<String>> headers = ycConnection.getHeaderFields(); 
    List<String> values = headers.get("Set-Cookie"); 
    String cookieValue = null; 
    for (java.util.Iterator<String> iter = values.iterator(); iter.hasNext();) { 
     String v = iter.next(); 
     if (cookieValue == null) 
      cookieValue = v; 
     else 
      cookieValue = cookieValue + ";" + v; 
    } 

    return new Login(cookieValue, response); 
} 

La excepción más típica que se ve es:

java.io.IOException: código de respuesta HTTP del servidor volvió: 504 para el URL: http://www.reddit.com/api/login/kagnito/ al sol. net.www.protocol.http.HttpURLConnection.getInputStream (Fuente desconocida)

Pero también he recibido una gran cantidad de "pa no válido ssword "mensajes.

¿Cómo puedo resolver esto? Estado en eso por horas!

Btw. Esto es lo que tengo problemas para entender: https://github.com/reddit/reddit/wiki/API%3A-login ¿No estoy seguro de cómo PUBLICAR esto? ¿Debería ir al encabezado, o? No estoy tan familiarizado con el protocolo HTTP. (De ahí mi proyecto - Estoy aprendiendo)

+0

Comprobar una actualización de mi respuesta – Strelok

Respuesta

9

Sin ahondar demasiado en por qué el resto no podría funcionar, hay un problema en el que son:

  • Usando URLEncoder para codificar su publicar datos: los datos de su publicación no van a la URL, por lo tanto, no la codifique.

  • No está configurando el encabezado Content-Length.

Esto es lo que usted debe tener para empezar:

public static Login POST(URL url, String user, String pw) throws IOException 
{ 

    String data= "api_type=json&user=" + user +"&passwd="+pw; 
    HttpURLConnection ycConnection = null; 
    ycConnection = (HttpURLConnection) url.openConnection(); 
    ycConnection.setRequestMethod("POST"); 
    ycConnection.setDoOutput(true); 
    ycConnection.setUseCaches (false); 
    ycConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 
    ycConnection.setRequestProperty("Content-Length", data.length()); 

    PrintWriter out = new PrintWriter(ycConnection.getOutputStream()); 


    out.print(data.getBytes()); 
    out.close(); 

    BufferedReader in = new BufferedReader(new InputStreamReader(ycConnection.getInputStream())); 
    String response = in.readLine(); 

    Map<String, List<String>> headers = ycConnection.getHeaderFields(); 
    List<String> values = headers.get("Set-Cookie"); 
    String cookieValue = null; 
    for (java.util.Iterator<String> iter = values.iterator(); iter.hasNext();) { 
     String v = iter.next(); 
     if (cookieValue == null) 
      cookieValue = v; 
     else 
      cookieValue = cookieValue + ";" + v; 
    } 

    return new Login(cookieValue, response); 
} 

Al trabajar con las API de este tipo, debe instalar definitivamente Fiddler que es depurador de HTTP. Inmediatamente habrías visto el problema, ya que los datos de tu publicación no se parecerían en nada al ejemplo.

ACTUALIZACIÓN:

Aquí es un poco de código que acaba de lanzar en una prueba y me autenticados bien (obviamente cambiar myusername y mypassword a la suya (no se olvide de cambiarlo en el URL también):..

@Test 
    public void someTest() throws IOException 
    { 
     URL u = new URL("https://ssl.reddit.com/api/login/myusername"); 
     login(u, "myusername", "mypassword"); 
    } 

    public static void login(URL url, String user, String pw) throws IOException 
    { 

     String data = "api_type=json&user=" + user + "&passwd=" + pw; 
     HttpURLConnection ycConnection = null; 
     ycConnection = (HttpURLConnection) url.openConnection(); 
     ycConnection.setRequestMethod("POST"); 
     ycConnection.setDoOutput(true); 
     ycConnection.setUseCaches(false); 
     ycConnection.setRequestProperty("Content-Type", 
      "application/x-www-form-urlencoded; charset=UTF-8"); 
     ycConnection.setRequestProperty("Content-Length", String.valueOf(data.length())); 

     DataOutputStream wr = new DataOutputStream(
      ycConnection.getOutputStream()); 
     wr.writeBytes(data); 
     wr.flush(); 
     wr.close(); 
     InputStream is = ycConnection.getInputStream(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     StringBuffer response = new StringBuffer(); 
     while ((line = rd.readLine()) != null) 
     { 
      response.append(line); 
      response.append('\r'); 
     } 
     for (Entry< String, List<String>> r : ycConnection.getHeaderFields().entrySet()) 
     { 
      System.out.println(r.getKey() + ": " + r.getValue()); 
     } 
     rd.close(); 
     System.out.println(response.toString()); 
    } 
+0

Todo lo que decía tenía sentido, y ahora ha cambiado de código para que Todo lo que viene después out.close() excepto en el saque La respuesta es irrelevante, ese no es el problema todavía, así que gracias por no sumergirse en eso. Pero el problema persiste, no me puedo autenticar. –

+0

Por favor, ignore la mala ortografía, no ha dormido tanto esta noche. –

+0

¡Muchas gracias! ¡Eso funciono! Voy a leer su código y entenderlo, antes de seguir adelante. ¡Pero realmente, gracias! –

Cuestiones relacionadas