2011-11-14 8 views
5

Tôi đang cố gắng sử dụng API Reddit để thực hiện một số nội dung. Tôi có tất cả mọi thứ đang hoạt động nhưng thay đổi các trang và đăng nhập.Tôi không thể sử dụng API của Reddit để đăng nhập

Tôi cần đăng nhập để sử dụng chương trình của mình, tôi biết cách sử dụng cookie tôi nhận được, nhưng tôi không thể quản lý để đăng nhập.

Dưới đây là các mã:

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

Trường hợp ngoại lệ điển hình nhất mà tôi nhận được là:

java.io.IOException: Máy chủ trả lại HTTP mã phản hồi: 504 cho URL: http://www.reddit.com/api/login/kagnito/ tại mặt trời. net.www.protocol.http.HttpURLConnection.getInputStream (Nguồn không xác định)

Nhưng tôi cũng đã nhận được rất nhiều "không hợp lệ pa ssword "tin nhắn.

Tôi làm cách nào để giải quyết vấn đề này? Đã ở đó hàng giờ!

Btw. Đây là những gì tôi đang gặp sự cố khi hiểu: https://github.com/reddit/reddit/wiki/API%3A-login Tôi không biết cách đăng bài này? Nó có nên đi vào tiêu đề hay không? Tôi không quen với giao thức HTTP. (Do đó dự án của tôi - Tôi đang học)

+0

Kiểm tra một bản cập nhật để – Strelok

Trả lời

9

Nếu không đào sâu quá nhiều vào lý do tại sao phần còn lại của nó có thể không hoạt động, có một vấn đề ở chỗ bạn là:

  • Sử dụng URLEncoder để mã hóa của bạn dữ liệu bài đăng: dữ liệu bài đăng của bạn sẽ không đi vào URL, do đó, không mã hóa nó.

  • Bạn không đặt tiêu đề Content-Length.

Dưới đây là những gì bạn cần phải bắt đầu:

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

Khi làm việc với các API như thế này, bạn nên cài đặt chắn Fiddler đó là HTTP debugger. Bạn sẽ thấy ngay vấn đề vì dữ liệu bài đăng của bạn sẽ không giống như ví dụ.

UPDATE:

Dưới đây là một mã ít tôi chỉ ném vào một thử nghiệm và nó chứng thực tôi chỉ tốt (rõ ràng là thay đổi myusernamemypassword như của bạn (đừng quên để thay đổi nó trong URL quá):..

@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

Mọi câu trả lời của tôi bạn nói có ý nghĩa tốt, và bây giờ tôi đã thay đổi mã để mà Tất cả những gì xảy ra sau khi out.close() ngoại trừ phục vụ r phản ứng là không liên quan, đó không phải là vấn đề được nêu ra, vì vậy cảm ơn bạn đã không lặn vào đó. Nhưng vấn đề vẫn tồn tại, tôi không thể được chứng thực. –

+0

Xin vui lòng bỏ qua chính tả xấu, đêm nay không ngủ nhiều. –

+0

Cảm ơn rất nhiều! Điều đó đã hiệu quả! Tôi sẽ đọc mã của bạn và hiểu nó, trước khi tôi tiếp tục. Nhưng thực sự, cảm ơn bạn! –