安卓请求网络的三种方式



post 或者 get 请求, post 请求安全,传输大小无限制,但是代码量多些, get 请求是浏览器有大小限制,用户提交的信息在浏览器的地址栏显示出来因此不安全



Android 中联网请求需要添加权限, 4.0 以后需要开启一个线程,在网络请求的时候都是以流的方式传输的



URL 的方式联网



(熟练地了解,当服务器需要传入特殊的请求头时候需要使用这种)



 

Android 网络请求登录实例 安卓网络请求方式_Android 网络请求登录实例


get


关于names与passwords是用户输入要提交的数据


设置连接的网络地址, get 请求就是拼接用户提交的内容到 URL重点注意事项:在安卓测试中 ip 地址不可写 localhost


ip 地址,否则执行到获取响应码一行时不执行,不报错等,服务器拿不到提交的信息,


也不会做出任何的反馈,所以执行到获取反馈时无任何执行


String path = "http://172.17.25.55:8080/login/LoginServlet?username="+ names + "&password=" + passwords; 
 
  
创建一个   URL 
  的连接实例
  

   URL url = new URL(path); 
 
  
通过   URL 
  的连接实例打开一个连接强转成 
  HttpURLConnection
  

   HttpURLConnection httpurlconn = (HttpURLConnection) url.openConnection(); 
 
  
然后设置请求的方式,这里一定要大写,   GET
  

   httpurlconn.setRequestMethod("GET"); 
 
  
利用强转后的连接设置请求响应超时
  

   httpurlconn.setConnectTimeout(5000); 
 
  
获取服务器返回的响应码
  

   int responseCode = httpurlconn.getResponseCode(); 
 
  
如果响应码是   200 
  就是成功, 
  206 
  是部分成功, 
  404 
  找不到页面, 
  504 
  等是服务器内部错误
  

   if (responseCode == 200) {  
 
  
响应成功后拿到服务器返回的数据,服务器返回是以字节流的形式返回
  

   InputStream ins = httpurlconn.getInputStream(); 
 
  
读取内容展示由于联网是需要开线程的而   UI 
  不允许子线程更新所以在 
  UI 
  线程写个方法在 
  UI 
  线程更新
  

   }


post


 


Android 网络请求登录实例 安卓网络请求方式_UI_02


请求路径 ☆☆☆☆☆☆☆重点注意事项:在安卓测试中 ip 地址不可写 localhost


ip 地址,否则执行到获取响应码一行时不执行,不报错等,


服务器拿不到提交的信息,也不会做出任何的反馈,所以执行到获取反馈时无任何执行

String path = "http://172.17.25.55:8080/login/"; 
 
  
创建一个   URL   的连接实例
  

   URL url = new URL(path); 
 
  
通过   URL   的连接实例打开一个连接强转成 
  HttpURLConnection
  

   HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
 
  
利用强转后的连接设置请求响应超时
  

   con.setConnectTimeout(5000); 
 
  
然后设置请求的方式,这里一定要大写   GET☆☆☆☆  
  

   con.setRequestMethod("POST"); 
 
  
请求体内容☆☆☆☆☆☆☆  
  

   String data = "username=" + names + "&password="+ passwords; 
 
  
请求方式是固定的必须这么写包括大小写这个是☆☆☆☆☆☆☆  
  

   con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
 
  
请求体(内容)的长度固定的必须这么写包括大小写这个是☆☆☆☆☆  
  

   con.setRequestProperty("Content-Length", data.length()+""); 
 
  
设置一个标记允许输出数据☆☆☆☆☆  
  
写入数据把我们组拼好的数据提交给服务器以流的形式提交 ☆☆☆☆  
  

   con.getOutputStream().write(data.getBytes()) 
 
  

   int responseCode = con.getResponseCode(); 
 
  
如果响应码是   200   就是成功, 
  206 
  是部分成功, 
  404 
  找不到页面, 
  504 
  等是服务器内部错误
  

   if (responseCode == 200) { 
 
  
响应成功后拿到服务器返回的数据,服务器返回是以字节流的形式返回
  

   InputStream ins = httpurlconn.getInputStream(); 
 
  
读取内容展示由于联网是需要开线程的而   UI   不允许子线程更新所以在 
  UI 
  线程写个方法在 
  UI 
  线程更新
  

   } 
 
  
   第二步使用系统结借鉴Alpha的封装好的类(了解即可)原因是请求头信息封装好了但是过于复杂,第三方完全可以更好的替代  
  
定义   get   方式要提交的路径小细节如果提交中文要对 
  name  
  和  
  pwd  
  进行一个 
  urlencode  
  编码 
  
Get
  
设置连接的网络地址,利用   URLEncoder   编码用户提交的数据这样中文就能够提交了,而且用户的信息有一些保障
  
names与passwords是用户提交的数据  
  

   String path ="http://172.17.25.55:8080/login/LoginServlet?username="+ URLEncoder.encode(names,"utf-8") + "&password=" +URLEncoder.encode(passwords,"utf-8") ; 
 
  
获取httpclient实力直接   new它的子类  
  

   DefaultHttpClient dehttp = new DefaultHttpClient(); 
 
  
准备   get   请求
  

   HttpGet get = new HttpGet(path); 
 
  
执行一个请求返回的是服务器响应结果
  

   HttpResponse httpresponse = dehttp.execute(get); 
 
  
拿到服务器响应码
  

   int statusCode = httpresponse.getStatusLine().getStatusCode(); 
 
  

   if(statusCode==200){ 
 
  
获取服务器返回的数据以实体的形式返回
  

   InputStream content = httpresponse.getEntity().getContent(); 
 
  
读取展示结果
  

   } 
 
  
   Post   
  

   String path = "http://172.17.25.55:8080/login/LoginServlet"; 
 
  
获取httpclient实力直接   new   他的子类
  

   DefaultHttpClient dehttp = new DefaultHttpClient(); 
 
  
准备    post   请求
  

   HttpPost post = new HttpPost(path); 
 
  
post   提交的正文,以键值对的形成
  
准备一个集合存放   NameValuePair
  

   List<NameValuePair> an = new ArrayList<NameValuePair>(); 
 
  
NameValuePair   子类实现是   BasicNameValuePair
  
创建需要提交的数据以   key value   的形式提交 
  key 
  是服务器根据去取的 
  key 
  ,
  

   BasicNameValuePair bnp1 = new BasicNameValuePair("username",names); 
 
  

   BasicNameValuePair bnp2 = new BasicNameValuePair("password",passwords); 
 
  

   //4.3添加到集合中 
 
  

   an.add(bnp1); 
 
  

   an.add(bnp2); 
 
  
entity   实体    new 
  一个子类实现 
  UrlEncodedFormEntity
  
需要的是一个   List<? extends NameValuePair>
  

   UrlEncodedFormEntity uf = new UrlEncodedFormEntity(an); 
 
  

   //4.5设置实体 
 
  

   post.setEntity(uf); 
 
  
执行一个请求返回的是服务器响应结果
  

   HttpResponse httpresponse = dehttp.execute(post); 
 
  
拿到服务器响应码
  

   int statusCode = httpresponse.getStatusLine().getStatusCode(); 
 
  

   if(statusCode==200){ 
 
  
获取服务器返回的数据以实体的形式返回
  

   InputStream content = httpresponse.getEntity().getContent(); 
 
  
读取展示结果
  

   } 
 
  
   第三步使用开源项目Asynhttpclient(熟练掌握)  
  
Asynhttpclient   需要导入第三方的   com 
  包,导完后报错,一个市报名错误删除即可还有一个是没有导包,导入包即可使用
  
names与passwords是用户提交的数据   
  
   Get  
  
设置连接的网络地址,利用   URLEncoder   编码用户提交的数据这样中文就能够提交了,而且用户的信息有一些保障
  

   String path = "http://172.17.25.55:8080/login/LoginServlet?username=" 
 
  

   + URLEncoder.encode(names,"utf-8") + "&password=" +URLEncoder.encode(passwords,"utf-8") ; 
 
  

   //2.创建一个asynchttp 
 
  

   AsyncHttpClient ashttp = new AsyncHttpClient(); 
 
  
get   请求传入一个路径,与一个   AsyncHttpResponseHandler 
  响应线程
  

   ashttp.get(path,new AsyncHttpResponseHandler() { 
 
  
请求成功的回调方法
  

   @Override 
 
  

   public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 
 
  
服务器返回的正文   statusCode   服务器返回的状态码,   
  Header 
  服务器返回的响应头信息
  

   try { 
 
  

   Toast.makeText(MainActivity.this,new String(responseBody,"gbk"), 0).show(); 
 
  

   } catch (UnsupportedEncodingException e) { 
 
  

   e.printStackTrace(); 
 
  

   } 
 
  

   } 
 
  
请求失败回调的方法
  

   @Override 
 
  

   public void onFailure(int statusCode, Header[] headers, 
 
  

   byte[] responseBody, Throwable error) { 
 
  

   Toast.makeText(MainActivity.this,new String(responseBody), 0).show(); 
 
  

   } 
 
  

   }); 
 
  
   Post  
  

   String path = "http://172.17.25.55:8080/login/LoginServlet"; 
 
  
创建一个asynchttp  
  

   AsyncHttpClient ashttp = new AsyncHttpClient(); 
 
  
准备请求体内容
  

   RequestParams params = new RequestParams(); 
 
  

   params.put("username", names); 
 
  

   params.put("password", passwords); 
 
  
请求一个   post   请求
  

   ashttp.post(path, params ,new AsyncHttpResponseHandler() { 
 
  

   @Override 
 
  

   public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 
 
  

   try { 
 
  

   Toast.makeText(MainActivity.this,new String(responseBody, "gbk"), 0).show(); 
 
  

   } catch (UnsupportedEncodingException e) { 
 
  

   e.printStackTrace(); 
 
  

   } 
 
  

   @Override 
 
  

   public void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) { 
 
  

   Toast.makeText(MainActivity.this, new String(responseBody),0).show(); 
 
  

   } 
 
  

   });