HttpPost works in Java project, not in Android

前端 未结 4 1767
无人共我
无人共我 2020-12-01 15:36

I\'ve written some code for my Android device to login to a web site over https and parse some data out of the resulting pages. An HttpGet happens

相关标签:
4条回答
  • 2020-12-01 15:54

    Check the RedirectHandler, override the default one and do some logging in it, I had problems with that when going to Android...

    0 讨论(0)
  • 2020-12-01 15:58

    to avoid the collisions use this jar for httpclient

    httplib

    and this post would also be very useful

    stack overflow post

    0 讨论(0)
  • 2020-12-01 16:01

    I have now given up on getting the HttpClient route to give the expected response from the server when run on Android. Instead I rewrote the doPost method above to use an HttpsURLConnection instead. Here's the new (working) version in the hope that it's useful to someone.

    private static LoginBean altPost(String username, String password, String cookie, String token){
        LoginBean loginBean = new LoginBean();
        HttpsURLConnection urlc = null;
        OutputStreamWriter out = null;
        DataOutputStream dataout = null;
        BufferedReader in = null;
        try {
            URL url = new URL(URL_LOGIN_SUBMIT);
            urlc = (HttpsURLConnection) url.openConnection();
            urlc.setRequestMethod("POST");
            urlc.setDoOutput(true);
            urlc.setDoInput(true);
            urlc.setUseCaches(false);
            urlc.setAllowUserInteraction(false);
            urlc.setRequestProperty(HEADER_USER_AGENT, HEADER_USER_AGENT_VALUE_FF);
            urlc.setRequestProperty("Cookie", cookie);
            urlc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
            String output = "org.apache.struts.taglib.html.TOKEN="+ URLEncoder.encode(token, HTTP.UTF_8)
                    +"&showLogin=true&upgrade=&username="+ URLEncoder.encode(username, HTTP.UTF_8)
                    +"&password="+ URLEncoder.encode(password, HTTP.UTF_8)+"&submit="
                    +URLEncoder.encode("Secure+Log+in", HTTP.UTF_8);
            dataout = new DataOutputStream(urlc.getOutputStream());
            // perform POST operation
            dataout.writeBytes(output);
            // get response info
            loginBean.setResponseCode(urlc.getResponseCode());
            // get required headers
            String headerName = null;
            StringBuffer newCookie = new StringBuffer(100);
            String redirectLocation = "";
            for (int i=1; (headerName = urlc.getHeaderField(i)) != null;i++) {
                if (headerName.indexOf(COOKIE_VALUE_SESSION) > -1) {
                    if (newCookie.length() > 0) {newCookie.append("; ");}
                    newCookie.append(headerName);
                }
                if (headerName.indexOf(COOKIE_VALUE_AUTH) > -1) {
                    if (newCookie.length() > 0) {newCookie.append("; ");}
                    newCookie.append(headerName);
                }
                if (headerName.indexOf("https://") > -1) {
                    redirectLocation = headerName;
                }
            }
            loginBean.setCookie(newCookie.toString());
            loginBean.setRedirectUrl(redirectLocation);
    
            in = new BufferedReader(new InputStreamReader(urlc.getInputStream()),8096);
            String response;
            // write html to System.out for debug
            while ((response = in.readLine()) != null) {
                System.out.println(response);
            }
            in.close();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return loginBean;
    }
    

    I still have no idea why the HttpClient way didn't work properly.

    0 讨论(0)
  • 2020-12-01 16:14

    Is it possible that this website does user-agent detection and actually returns different results because it's Android? Given that 200 implies success, why must it give a 302 instead of a 200? Have you printed out the result that you get when it returns a 200, and does it give any additional information?

    0 讨论(0)
提交回复
热议问题