Android: HttpURLConnection not working properly
I've figured out what was the problem. It seems that using Java Desktop, the flag FollowRedirects is false by default (I suppose) and in Android it is true. getInstanceFollowRedirects is TRUE in both cases, so I don't really know why it works in a different way, but nevermind, the solution is perfect.
So it wasn't capturing the response of the POST request, it was following some redirection and trying to get the response from another GET auto request.
The solution was to do: connection.setInstanceFollowRedirects(false);
The way I could know this was looking into the network traffic using a network monitor:
From the Desktop application it was monitored this traffic:
23 10:08:50 03/10/2012 1.3944670 javaw.exe 192.168.1.36 www.XXXXXXXXX.com HTTP HTTP:Request, POST /es/login.php {HTTP:8, TCP:7, IPv4:6}
24 10:08:50 03/10/2012 1.3954741 javaw.exe 192.168.1.36 www.XXXXXXXXX.com HTTP HTTP:HTTP Payload, URL: /es/login.php {HTTP:8, TCP:7, IPv4:6}
32 10:08:50 03/10/2012 1.9811257 javaw.exe www.XXXXXXXXX.com 192.168.1.36 HTTP HTTP:Response, HTTP/1.1, Status: Moved temporarily, URL: /es/login.php {HTTP:8, TCP:7, IPv4:6}
To monitor the traffic in Android application I had to run it in the emulator instead the phone.The result was:
60 9:59:34 03/10/2012 4.0285909 emulator-arm.exe 192.168.1.36 XX.XX.XXX.XXX HTTP HTTP:Request, POST /es/login.php {HTTP:13, TCP:12, IPv4:11}
65 9:59:34 03/10/2012 4.1524735 emulator-arm.exe 192.168.1.36 XX.XX.XXX.XXX HTTP HTTP:HTTP Payload, URL: /es/login.php {HTTP:13, TCP:12, IPv4:11}
75 9:59:35 03/10/2012 4.6276286 emulator-arm.exe XX.XX.XXX.XXX 192.168.1.36 HTTP HTTP:Response, HTTP/1.1, Status: Moved temporarily, URL: /es/login.php {HTTP:13, TCP:12, IPv4:11}
77 9:59:35 03/10/2012 4.7095994 emulator-arm.exe 192.168.1.36 XX.XX.XXX.XXX HTTP HTTP:Request, GET /es/login.php, Query:FASID=a5e39f35325499e060f43d35bc956a45 {HTTP:13, TCP:12, IPv4:11}
311 9:59:55 03/10/2012 24.8355823 emulator-arm.exe XX.XX.XXX.XXX 192.168.1.36 HTTP HTTP:Response, HTTP/1.1, Status: Moved temporarily, URL: /es/login.php {HTTP:13, TCP:12, IPv4:11}
313 9:59:55 03/10/2012 24.9384843 emulator-arm.exe 192.168.1.36 XX.XX.XXX.XXX HTTP HTTP:Request, GET /es/main.html, Query:FASID=a5e39f35325499e060f43d35bc956a45 {HTTP:13, TCP:12, IPv4:11}
317 9:59:55 03/10/2012 25.0535818 emulator-arm.exe XX.XX.XXX.XXX 192.168.1.36 HTTP HTTP:HTTP Payload, URL: /es/main.html {HTTP:13, TCP:12, IPv4:11}
So, after applying the **connection.setInstanceFollowRedirects(false);**
the result was the expected:
61 10:30:43 03/10/2012 4.9211205 emulator-arm.exe 192.168.1.36 XX.XX.XXX.XXX HTTP HTTP:Request, POST /es/login.php {HTTP:14, TCP:13, IPv4:12}
64 10:30:43 03/10/2012 5.0362501 emulator-arm.exe 192.168.1.36 XX.XX.XXX.XXX HTTP HTTP:HTTP Payload, URL: /es/login.php {HTTP:14, TCP:13, IPv4:12}
70 10:30:43 03/10/2012 5.5103384 emulator-arm.exe XX.XX.XXX.XXX 192.168.1.36 HTTP HTTP:Response, HTTP/1.1, Status: Moved temporarily, URL: /es/login.php {HTTP:14, TCP:13, IPv4:12}
Thank you for all your answers and interest.
giorgiline
Updated on June 15, 2022Comments
-
giorgiline almost 2 years
I'm trying to get the cookies from a website after sending user credentials through a POST Request an it seems that it doesn't work in android this way. ¿Am I doing something bad?. Please help. I've searched here in different posts but there's no useful answer.
It's curious that this run in a desktop Java implementation it works perfect but it crashes in Android platform. And it is exactly the same code, specifically when calling HttpURLConnection.getHeaderFields(), it also happens with other member methods. It's a simple code and I don't know why the hell isn't working.
DESKTOP CODE: This goes just in the main()
HttpURLConnection connection = null; OutputStream out = null; try { URL url = new URL("http://www.XXXXXXXX.php"); String charset = "UTF-8"; String postback = "1"; String user = "XXXXXXXXX"; String password = "XXXXXXXX"; String rememberme = "on"; String query = String.format("postback=%s&user=%s&password=%s&rememberme=%s" , URLEncoder.encode(postback, charset) , URLEncoder.encode(user,charset) , URLEncoder.encode(password, charset) , URLEncoder.encode(rememberme, charset)); connection = (HttpURLConnection)url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Accept-Charset", charset); connection.setDoOutput(true); connection.setFixedLengthStreamingMode(query.length()); out = connection.getOutputStream (); out.write(query.getBytes(charset)); if (connection.getHeaderFields() == null){ System.out.println("Header null"); }else{ for (String cookie: connection.getHeaderFields().get("Set-Cookie")){ System.out.println(cookie.split(";", 2)[0]); } } } catch (IOException e){ e.printStackTrace(); } finally { try { out.close();} catch (IOException e) { e.printStackTrace();} connection.disconnect(); }
So the output is:
login_key=20ad8177db4eca3f057c14a64bafc2c9 FASID=cabf20cc471fcacacdc7dc7e83768880 track=30c8183e4ebbe8b3a57b583166326c77 client-data=%7B%22ism%22%3Afalse%2C%22showm%22%3Afalse%2C%22ts%22%3A1349189669%7D
ANDROID CODE: This goes inside doInBackground AsyncTask body
HttpURLConnection connection = null; OutputStream out = null; try { URL url = new URL("http://www.XXXXXXXXXXXXXX.php"); String charset = "UTF-8"; String postback = "1"; String user = "XXXXXXXXX"; String password = "XXXXXXXX"; String rememberme = "on"; String query = String.format("postback=%s&user=%s&password=%s&rememberme=%s" , URLEncoder.encode(postback, charset) , URLEncoder.encode(user,charset) , URLEncoder.encode(password, charset) , URLEncoder.encode(rememberme, charset)); connection = (HttpURLConnection)url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Accept-Charset", charset); connection.setDoOutput(true); connection.setFixedLengthStreamingMode(query.length()); out = connection.getOutputStream (); out.write(query.getBytes(charset)); if (connection.getHeaderFields() == null){ Log.v(TAG, "Header null"); }else{ for (String cookie: connection.getHeaderFields().get("Set-Cookie")){ Log.v(TAG, cookie.split(";", 2)[0]); } } } catch (IOException e){ e.printStackTrace(); } finally { try { out.close();} catch (IOException e) { e.printStackTrace();} connection.disconnect(); }
And here there is no output, it seems that connection.getHeaderFields() doesn't return result. It takes al least 30 seconds to show the Log:
10-02 16:56:25.918: V/class com.giorgi.myproject.activities.HomeActivity(2596): Header null
TESTED ON A GALAXY NEXUS
-
giorgiline over 11 yearsSo what would you recommend me to look into?
-
Emil Davtyan over 11 yearsCan you open it in the mobile browser?
-
giorgiline over 11 yearsChecked. Those are the only two permissions added in the manifest.
-
giorgiline over 11 yearsI've tried several orders of setting properties but it seems that's not the reason.
-
Mr_and_Mrs_D over 10 years
conn.setDoOutput(true)
will set the method to POST