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/
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。