Android:如何以编程方式登录网站并从中检索数据?

时间:2014-03-28 16:04:57

标签: java android post httpclient httpurlconnection

好的,大家好,所以我最近在开发Android应用程序,将用户的ID和PASSWORD保存到SharedPreferences。现在,当用户第二次启动应用程序时,他将通过listView中的一些选项直接重定向到MainActivity。而现在我头疼得厉害,它让我变得疯狂。我无法登录网站并将数据提取到手机。我尝试过使用Http(s)UrlConnection,HttpClient,但它似乎并不适合我。我从POST方法获得的只是登录页面的源代码。

现在,有登录页面:https://medeine.vgtu.lt/studentams/login.jsp?klb=en

和我的目标网页:https://medeine.vgtu.lt/studentams/pask_stud.jsp< - 我需要从那里获取数据

您是否有任何想法或提示/方法/指南/任何如何做到这一点?

3 个答案:

答案 0 :(得分:5)

为此,您必须发送两个POST请求。在第一次请求中,如果成功登录,则需要发送登录数据并保存cookie。在第二个请求中,需要发送已保存的cookie,您可以获取数据。    POST的数据必须格式如下:var = value& var2 = value2

在你的情况下:

String data = "studKnNr=login&asmKodas=password";

请求的网址:https://medeine.vgtu.lt/studentams/submit.jsp

查看以下代码:

String data = "studKnNr=login&asmKodas=password";
String loginUrl = "https://medeine.vgtu.lt/studentams/submit.jsp";
String Login = POST_req(loginUrl, data, 10000); /*last parameter is a limit of page content length*/

//And after succcess login you can send second request:
String pageContent = POST_req(someUrl, "", 10000);


//Methods for sending requests and saving cookie: 
//(this no needs for changing, can only past to you project)
public String POST_req(String url, String post_data, int len) {
    URL addr = null;
    try {
            addr = new URL(url);
        } catch (MalformedURLException e) {
            return "Некорректный URL";
        }
        StringBuffer data = new StringBuffer();
        HttpURLConnection conn = null;
        try {
            conn = (HttpURLConnection) addr.openConnection();
        } catch (IOException e) {
            return "Open connection error";
        }
        conn.setRequestProperty("Connection", "keep-alive");
        conn.setRequestProperty("Accept-Language", "ru,en-GB;q=0.8,en;q=0.6");
        conn.setRequestProperty("Accept-Charset", "utf-8");
        conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        conn.setRequestProperty("Cookie", "");
        conn.setDoOutput(true);
        conn.setDoInput(true);
        //conn.setInstanceFollowRedirects(true);
        set_cookie(conn);

        //POST data: 
        String post_str = post_data;
        data.append(post_str);
        try {
            conn.connect();
        } catch (IOException e) {
            return "Connecting error";
        }
        DataOutputStream dataOS = null;
        try {
            dataOS = new DataOutputStream(conn.getOutputStream());
        } catch (IOException e2) {
            return "Out stream error";
        }
        try {
            ((DataOutputStream) dataOS).writeBytes(data.toString());
        } catch (IOException e) {
            return "Out stream error 1";
        }

        /*If redirect: */
        int status;
        try {
            status = conn.getResponseCode();
        } catch (IOException e2) {
            return "Response error";
        }
        if (status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_MOVED_PERM || status == HttpURLConnection.HTTP_SEE_OTHER) {
            String new_url = conn.getHeaderField("Location");
            String cookies = conn.getHeaderField("Set-Cookie");
            URL red_url;
            try {
                red_url = new URL(new_url);
            } catch (MalformedURLException e) {
                return "Redirect error";
            }
            try {
                conn = (HttpURLConnection) red_url.openConnection();
            } catch (IOException e) {
                return "Redirect connection error";
            }
            //conn.setRequestProperty("Content-type", "text/html");
            conn.setRequestProperty("Connection", "keep-alive");
            conn.setRequestProperty("Accept-Language", "ru,en-GB;q=0.8,en;q=0.6");
            conn.setRequestProperty("Accept-Charset", "utf-8");
            conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
            conn.setRequestProperty("Cookie", cookies);     
            conn.setDoOutput(true);
            conn.setDoInput(true);
            //conn.setInstanceFollowRedirects(true);
        }

        java.io.InputStream in = null;
        try {
            in = (java.io.InputStream) conn.getInputStream();
        } catch (IOException e) {
            return "In stream error";
        }
        InputStreamReader reader = null;
        try {
            reader = new InputStreamReader(in, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            return "In stream error";
        }
        char[] buf = new char[len];
        try {
            reader.read(buf);
        } catch (IOException e) {
            return "In stream error";
        }
        get_cookie(conn);

        return (new String(buf));
    }
    public void get_cookie(HttpURLConnection conn) {
        SharedPreferences sh_pref_cookie = getSharedPreferences("cookies", Context.MODE_PRIVATE);
        String cook_new;
        String COOKIES_HEADER;
        if (conn.getHeaderField("Set-Cookie") != null) {
            COOKIES_HEADER = "Set-Cookie";
        }
        else {
            COOKIES_HEADER = "Cookie";
        }
        cook_new = conn.getHeaderField(COOKIES_HEADER);
        if (cook_new.indexOf("sid", 0) >= 0) {
            SharedPreferences.Editor editor = sh_pref_cookie.edit();
            editor.putString("Cookie", cook_new);
            editor.commit();
        }
    }
    public void set_cookie(HttpURLConnection conn) {
        SharedPreferences sh_pref_cookie = getSharedPreferences("cookies", Context.MODE_PRIVATE);
        String COOKIES_HEADER = "Cookie";
        String cook = sh_pref_cookie.getString(COOKIES_HEADER, "no_cookie");
        if (!cook.equals("no_cookie")) {
            conn.setRequestProperty(COOKIES_HEADER, cook);
        }
    }

当然你必须在异步线程中发送请求。

希望它有所帮助。请原谅我的英语不好:)

答案 1 :(得分:1)

有一个非常好的远程登录教程用android php mysql @这个地址:

http://www.mybringback.com/tutorial-series/12924/android-tutorial-using-remote-databases-php-and-mysql-part-1/

如果它对您有用,请投票给我答案,我会对你的问题做同样的事,再见

答案 2 :(得分:1)

如果你想在java或android中使用你的应用程序登录,那么你需要尝试使用HTTPPOST

示例代码:

public class HttpPostExample extends Activity {

      TextView content;
      EditText fname, email, login, pass;
      String Name, Email, Login, Pass;

      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_http_post_example);

          content    =   (TextView)findViewById( R.id.content );
          fname      =   (EditText)findViewById(R.id.name);
          email      =   (EditText)findViewById(R.id.email);
          login      =    (EditText)findViewById(R.id.loginname);
          pass       =   (EditText)findViewById(R.id.password);


          Button saveme=(Button)findViewById(R.id.save);

          saveme.setOnClickListener(new Button.OnClickListener(){

              public void onClick(View v)
              {
                  try{

                           // CALL GetText method to make post method call
                          GetText();
                   }
                  catch(Exception ex)
                   {
                      content.setText(" url exeption! " );
                   }
              }
          }); 
      }

  // Create GetText Metod
public  void  GetText()  throws  UnsupportedEncodingException
      {
          // Get user defined values
          Name = fname.getText().toString();
          Email   = email.getText().toString();
          Login   = login.getText().toString();
          Pass   = pass.getText().toString();

           // Create data variable for sent values to server 

            String data = URLEncoder.encode("name", "UTF-8")
                         + "=" + URLEncoder.encode(Name, "UTF-8");

            data += "&" + URLEncoder.encode("email", "UTF-8") + "="
                        + URLEncoder.encode(Email, "UTF-8");

            data += "&" + URLEncoder.encode("user", "UTF-8")
                        + "=" + URLEncoder.encode(Login, "UTF-8");

            data += "&" + URLEncoder.encode("pass", "UTF-8")
                        + "=" + URLEncoder.encode(Pass, "UTF-8");

            String text = "";
            BufferedReader reader=null;

            // Send data
          try
          {

              // Defined URL  where to send data
              URL url = new URL("http://androidexample.com/media/webservice/httppost.php");

           // Send POST data request

            URLConnection conn = url.openConnection();
            conn.setDoOutput(true);
            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write( data );
            wr.flush();

            // Get the server response

          reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
          StringBuilder sb = new StringBuilder();
          String line = null;

          // Read Server Response
          while((line = reader.readLine()) != null)
              {
                     // Append server response in string
                     sb.append(line + "\n");
              }


              text = sb.toString();
          }
          catch(Exception ex)
          {

          }
          finally
          {
              try
              {

                  reader.close();
              }

              catch(Exception ex) {}
          }

          // Show response on activity
          content.setText( text  );

      }

  }

我从此网址url获取此来源,您可以获得与查询相关的所有内容。

或如果您想连接到* FTP登录* ,那么您可以按照以下代码

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;

import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

public class Ftpdemo {  


     public static void main(String args[]) {  

      // get an ftpClient object  
      FTPClient ftpClient = new FTPClient();  
      ftpClient.setConnectTimeout(300);
      FileInputStream inputStream = null;  

      try {  
       // pass directory path on server to connect  
       ftpClient.connect("ftp.mydomain.in");  

       // pass username and password, returned true if authentication is  
       // successful  
       boolean login = ftpClient.login("myusername", "mypassword");  

       if (login) {  
        System.out.println("Connection established...");  
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

        ftpClient.enterLocalPassiveMode();

        inputStream = new FileInputStream("/home/simmant/Desktop/mypic.png");  

        boolean uploaded = ftpClient.storeFile("user_screens/test3.png",inputStream);



              if (uploaded) {  
         System.out.println("File uploaded successfully !");  
        } else {  
         System.out.println("Error in uploading file !");  
        }  

        // logout the user, returned true if logout successfully  
        boolean logout = ftpClient.logout();  
        if (logout) {  
         System.out.println("Connection close...");  
        }  
       } else {  
        System.out.println("Connection fail...");  
       }  

      } catch (SocketException e) {  
       e.printStackTrace();  
      } catch (IOException e) {  
       e.printStackTrace();  
      } finally {  
       try {  
        ftpClient.disconnect();  
       } catch (IOException e) {  
        e.printStackTrace();  
       }  
      }  
     }


    }