Without delving too much into why the rest of it might not work, there is a problem in that you are:
Using URLEncoder
to encode your post data: your post data is not going to into the URL, so do not encode it.
You are not setting the Content-Length
header.
Here is what you should have to get started:
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);
}
When working with APIs like this, you should definetly install Fiddler which is HTTP debugger. You would have immediately seen the problem as your post data would look nothing like the example.
UPDATE:
Here is a little code I just threw into a test and it authenticated me just fine (obviously change myusername
and mypassword
to yours (don't forget to change it in the URL too):
@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( '
' );
}
for ( Entry< String, List< String >> r : ycConnection.getHeaderFields().entrySet() )
{
System.out.println( r.getKey() + ": " + r.getValue() );
}
rd.close();
System.out.println( response.toString() );
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…