zoukankan      html  css  js  c++  java
  • Android数据与服务器交互的GET,POST,HTTPGET,HTTPPOST的使用

    Android有这几种方式,可以提交数据到服务器,他们是怎么使用的呢,这里我们来探讨一下。

    这里的例子用的都是提交客户端的用户名及密码,同时本节用到的StreamTools.readInputStream(is);作用是把输入流转化为字符串,是一个公共类。我在前面介绍过了。http://www.cnblogs.com/fengtengfei/p/3969520.html,这里就不在重复的说明了。

    第一种:GET

    关键部分是:

    首先我们用URL包装访问的路径,由于是get请求,在学习javaWEB的时候我们就以及知道了,路径中要把提交的参数拼装。

    然后我们openConnection(),其返回的是HttpURLConnection对象,拿到这个对象我们就可以进行相关参数,及超时的设置,以及获取服务器的返回码了。

    			URL url = new URL(path);
    			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    			conn.setConnectTimeout(5000);
    			conn.setRequestMethod("GET");
    			int code = conn.getResponseCode();
    

    example:

     1 public static String loginByGet(String username,String password) {
     2         //提交数据到发服务器
     3         String path = null;
     4         try {
     5             path = "http://192.168.254.100:8080/web/LoginServlet?username="+URLEncoder.encode(username,"utf-8")+"&password="+password;
     6         } catch (UnsupportedEncodingException e1) {
     7             // TODO Auto-generated catch block
     8             e1.printStackTrace();
     9         }
    10         
    11         try {
    12             URL url = new URL(path);
    13             
    14             HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    15             conn.setConnectTimeout(5000);
    16             conn.setRequestMethod("GET");
    17             
    18             
    19             int code = conn.getResponseCode();
    20             if(code==200){
    21                 //请求成功
    22                 InputStream is = conn.getInputStream();
    23                 String result = StreamTools.readInputStream(is);
    24                 
    25                 return result;
    26             }else{
    27                 return null;
    28             }
    29             
    30             
    31         } catch (Exception e) {
    32             // TODO Auto-generated catch block
    33             e.printStackTrace();
    34             return null;
    35         }
    36         
    37     }

    第二种:Post

    在网页的get与post的请求的对比中我们知道post比get多了几个参数,所以这里我们也是要对相关参数进行设置的,

    首先我们要设置的是Content-type与Cotent-Length,

    	           String data = "username="+URLEncoder.encode(username,"utf-8")+"&password="+password;
    			conn.setRequestProperty("Content-Type:", "application/x-www-form-urlencoded");
    			conn.setRequestProperty("Content-Length:", data.length()+"");
    

     其次,post的方式,实际上是浏览器把数据写给服务器。所以我们要设置相关参数,让服务器允许我们有写的权限,

    	          conn.setDoOutput(true);
    			OutputStream os = conn.getOutputStream();
    			os.write(data.getBytes());
    

     example

     1 public static String loginByPost(String username,String password){
     2         //POST提交数据到发服务器
     3         String path = "http://192.168.254.100:8080/web/LoginServlet";
     4         
     5         try {
     6             URL url = new URL(path);
     7             
     8             HttpURLConnection conn = (HttpURLConnection) url.openConnection();
     9             conn.setConnectTimeout(5000);
    10             conn.setRequestMethod("POST");
    11             //准备数据,计算其长度
    12             String data = "username="+URLEncoder.encode(username,"utf-8")+"&password="+password;
    13             conn.setRequestProperty("Content-Type:", "application/x-www-form-urlencoded");
    14             conn.setRequestProperty("Content-Length:", data.length()+"");
    16             //post的方式,实际上是浏览器把数据写给服务器。
    17             //允许写数据
    18             conn.setDoOutput(true);
    19             OutputStream os = conn.getOutputStream();
    20             os.write(data.getBytes());
    21             System.out.println("2");
    22             
    23             int code = conn.getResponseCode();25             if(code==200){
    26                 //请求成功
    27                 InputStream is = conn.getInputStream();
    28                 String result = StreamTools.readInputStream(is);
    29                 
    30                 return result;
    31             }else{
    32                 return null;
    33             }
    34             
    35             
    36         } catch (Exception e) {
    37             // TODO Auto-generated catch block
    38             e.printStackTrace();
    39             return null;
    40         }
    41         
    42     }

    第三种:httpclientget

    使用步骤是,我们首先要实例化一个HttpClient的对象,同时也要实例一个HttpGet的对象,让HttpClient的对象去execute(HttpGet的对象),这时我们可以得到HttpResponse的对象,二者就是服务器的返回的对象,所以区别就在这里了。

    这里的返回码是这样获得的response.getStatusLine().getStatusCode();使用中要注意。

    example:

    public static String loginByHttpClientGet(String username,String password){
            try {
                HttpClient client = new DefaultHttpClient();
                String path = "http://192.168.254.100:8080/web/LoginServlet?username="
                +URLEncoder.encode(username)+"&password="+URLEncoder.encode(password);
                HttpGet httpGet = new HttpGet(path);
                //执行操作。敲回车
                HttpResponse response = client.execute(httpGet);
                int code = response.getStatusLine().getStatusCode();
                if(code==200){
                    //请求成功
                    InputStream is = response.getEntity().getContent();
                    String result = StreamTools.readInputStream(is);
                    
                    return result;
                }else{
                    return null;
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
    
        }

    第四种:httpclientpost

    采用HttpClientPost的方式与HttpClientGet的方式的区别是HttpPost要指定提交的数据实体,而这里的实现就像是map,所以对于参数较多的时候,这种方式是最为便捷的。

    	                List<NameValuePair> parameters = new ArrayList<NameValuePair>();
    			parameters.add(new BasicNameValuePair("username", username));
    			parameters.add(new BasicNameValuePair("password", password));            
    

     example:

    public static String loginByHttpClientPost(String username,String password){
            try {
                HttpClient client = new DefaultHttpClient();
                String path = "http://192.168.254.100:8080/web/LoginServlet";
                HttpPost post = new HttpPost();
                //指定要提交的数据实体
                List<NameValuePair> parameters = new ArrayList<NameValuePair>();
                parameters.add(new BasicNameValuePair("username", username));
                parameters.add(new BasicNameValuePair("password", password));
                post.setEntity(new UrlEncodedFormEntity(parameters, "utf-8"));
                
                HttpResponse response = client.execute(post);
                
                int code = response.getStatusLine().getStatusCode();
                if(code==200){
                    //请求成功
                    InputStream is = response.getEntity().getContent();
                    String result = StreamTools.readInputStream(is);
                    
                    return result;
                }else{
                    return null;
                }
                
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
        }

    作者:Darren

    微博:@IT_攻城师

    出处:http://www.cnblogs.com/fengtengfei/

  • 相关阅读:
    codevs1842 递归第一次
    codevs1501 二叉树最大宽度和高度
    (noi.openjudge.cn) 1.5编程基础之循环控制T36——T45
    (noi.openjudge.cn) 1.7编程基础之字符串T21——T30
    (noi.openjudge.cn) 1.9编程基础之顺序查找T06——T15
    (noi.openjudge.cn) 1.9编程基础之顺序查找T01——T05
    (noi.openjudge.cn) 1.7编程基础之字符串T31——T35
    (noi.openjudge.cn) 1.8编程基础之多维数组T21——T25
    Objective-C/C++混编编译器设置
    UITableView使用指南
  • 原文地址:https://www.cnblogs.com/fengtengfei/p/3970463.html
Copyright © 2011-2022 走看看