首页 > 代码库 > Android数据与服务器交互的GET,POST,HTTPGET,HTTPPOST的使用
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 block33 e.printStackTrace();34 return null;35 }36 37 }
第二种:Post
在网页的get与post的请求的对比中我们知道post比get多了几个参数,所以这里我们也是要对相关参数进行设置的,
首先我们要设置的是Content-type与Cotent-Length,
String data = "http://www.mamicode.com/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 = "http://www.mamicode.com/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 block38 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/
Android数据与服务器交互的GET,POST,HTTPGET,HTTPPOST的使用