转载自:http://www.cnblogs.com/cxcco/archive/2012/02/09/2344455.html,尊重原创!
在开始前先简单介绍下HTTP协议中的两种不同的请求方式——GET和POST。GET方式在进行数据请求时,会把数据附加到URL后面传递给服务器,比如常见的:http://XXX.XXX.XXX/XX.aspx?id=1,POST方式则是将请求的数据放到HTTP请求头中,作为请求头的一部分传入服务器。所以,在进行HTTP编程前,首先要明确究竟使用的哪种方式进行数据请求的。
在Android中,可以有两种方式可以用来进行Http编程:1、HttpURLConnection;2、HttpClient。
- HttpURLConnection
HttpURLConnection是继承自URLConnection的一个抽象类,在HTTP编程时,来自HttpURLConnection的类是所有操作的基础。无法直接实例化对象,获取该对象的代码如下:
1 public HttpURLConnection urlconn= null; 2 private void Init() throws IOException 3 { 4 if (urlStr=="") 5 { 6 urlStr="http://www.baidu.com"; 7 } 8 URL url = new URL(urlStr); 9 //打开一个URL所指向的Connection对象 10 urlconn = (HttpURLConnection)url.openConnection(); 11 }
openConnection()只创建URLConnection或者HttpURLConnection的实例,并不是真正的进行连接操作。
HttpURLConnection对网络资源的请求在默认情况下是使用GET方式的,所以当使用GET方式时,不需要我们做太多的工作:
1 /** 2 * Http中的get请求,在Url中带有请求的参数,请求的URL格式通常为:"http://XXX.XXXX.com/xx.aspx?param=value" 3 * 在android中默认的http请求为get方式 4 * @return 5 * @throws IOException 6 */ 7 public String HttpGetMethod() throws IOException 8 { 9 if(urlconn == null) 10 { 11 Init(); 12 } 13 String result = StreamDeal(urlconn.getInputStream()); 14 urlconn.disconnect(); 15 return result; 16 }
当我们需要使用POST方式时,就需要使用setRequestMethod()来设置请求方式了,然后将参数内容通过writeBytes方法写入数据流。(post请求不能使用缓存)
1 /** 2 * Http中的post请求,不在Url中附加任何参数,这些参数都会通过cookie或者session等其他方式以键值对的形式key=value传送到服务器上,完成一次请求 3 * 请求的URL格式通常为:"http://XXX.XXXX.com/xx.aspx" 4 * @param param 请求的键名 5 * @param value 请求的数据值 6 * @throws IOException 7 */ 8 public String HttpPostMethod(String key,String value) throws IOException 9 { 10 if (urlconn==null) 11 { 12 Init(); 13 } 14 //设置该URLConnection可读 15 urlconn.setDoInput(true); 16 //设置该URLConnection可写 17 urlconn.setDoOutput(true); 18 //使用POST方式来提交数据 19 urlconn.setRequestMethod("POST"); 20 //不运行缓存 21 urlconn.setUseCaches(false); 22 //当使用POST方式进行数据请求时,我们可以手动执行connect动作,当然,这个动作其实在getOutputStream()方法中会默认执行的 23 //上面那些设置URLConnection属性的动作,一定要在connect动作执行前,因为一旦动作已经执行,熟悉设置就没有任何作用了 24 urlconn.connect(); 25 //使用POST方式时,我们需要自己构造部分Http请求的内容,因此我们需要使用OutputStream来进行数据写如操作 26 OutputStreamWriter writer = new OutputStreamWriter(urlconn.getOutputStream()); 27 28 String urlQueryStr = key+"="+URLEncoder.encode(value, "Utf-8"); 29 writer.write(urlQueryStr); 30 31 writer.flush(); 32 writer.close(); 33 //获取返回的内容 34 String result = StreamDeal(urlconn.getInputStream()); 35 return result; 36 37 }
-
HttpClient
这个类并不是来自Android的,而是来自org.apache.http。和HttpURLConnection相同,HttpClient也存在GET和POST两种方式。
HttpGet
在HttpClient中,我们可以非常轻松使用HttpGet对象来通过GET方式进行数据请求操作,当获得HttpGet对象后我们可以使用HttpClient的execute方法来向我们的服务器发送请求。在发送的GET请求被服务器相应后,会返回一个HttpResponse响应对象,利用这个响应的对象我们能够获得响应回来的状态码,如:200、400、401等等。
1 String httpurl ="http://www.baidu.com/baidu?word=apache&sg=123"; 2 //httpget连接对象 3 HttpGet httpRequest = new HttpGet(httpurl); 4 try{ 5 //取得HttpClient对象 6 //DefaultHttpClient是默认的一个Http客户端,我们可以使用它创建一个Http连接 7 HttpClient httpclient = new DefaultHttpClient(); 8 9 //请求HttpClient,取得HttpResponse 10 //HttpResponse是一个Http连接响应,当执行Http连接时,就会返回一个HttpResponse 11 //可以通过HttpResponse获得一些响应的信息 12 HttpResponse httpresponse = httpclient.execute(httpRequest); 13 14 //请求成功 15 if(httpresponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ 16 //取得返回的字符串 17 String strResult = EntityUtils.toString(httpresponse.getEntity()); 18 } 19 }catch(ClientProtocolException e){ 20 21 }catch(IOException e){ 22 23 }catch(Exception e){ 24 25 } 26 }
HttpPost
当我们使用POST方式时,我们可以使用HttpPost类来进行操作。当获取了HttpPost对象后,我们就需要向这个请求体传入键值对,这个键值对我们可以使用NameValuePair对象来进行构造,然后再使用HttpRequest对象最终构造我们的请求体,最后使用HttpClient的execute方法来发送我们的请求,并在得到响应后返回一个HttpResponse对象。其他操作和我们在HttpGet对象中的操作一样。
1 String httpurl ="http://www.baidu.com/baidu"; 2 //HttpPost连接对象 3 HttpPost httpRequest = new HttpPost(httpurl); 4 5 //使用List<E>ValuePair键值对来保存要传递的Post参数 6 List<NameValuePair> params = new ArrayList<NameValuePair>(); 7 //添加要传递的参数 8 params.add(new BasicNameValuePair("word","apache")); 9 params.add(new BasicNameValuePair("sg","123")); 10 try{ 11 //设置字符集 12 HttpEntity httpentity = new UrlEncodedFormEntity(params,"gb2312"); 13 14 //请求httpRequest 15 httpRequest.setEntity(httpentity); 16 17 //取得默认的HttpClient对象 18 HttpClient httpclient = new DefaultHttpClient(); 19 20 //请求HttpClient,取得HttpResponse 21 HttpResponse httpresponse = httpclient.execute(httpRequest); 22 23 //请求成功 24 if(httpresponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ 25 //取得返回的字符串 26 String strResult = EntityUtils.toString(httpresponse.getEntity()); 27 }catch(ClientProtocolException e){ 28 }catch(IOException e){ 29 }catch(Exception e){ 30 }
小小的区别一下HttpURLConnection和URLConnection:
1、HttpURLConnection继承自URLConnection,都是抽象类;
2、URLConnection 是所有表示应用程序与 URL 之间通信链路的类的超类。该类的实例可以用来对由 URL 引用的资源进行读取和写入操作;
3、HttpURLConnection是支持 HTTP 的特定功能的 URLConnection,可以处理HTTP协议的相关操作。