http通信

  转载自: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的类是所有操作的基础。无法直接实例化对象,获取该对象的代码如下:

View Code
 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方式时,不需要我们做太多的工作:

View Code
 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请求不能使用缓存)

View Code
 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等等。

View Code
 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对象中的操作一样。

View Code
 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协议的相关操作。

 

posted @ 2013-04-09 10:44  little_star  阅读(283)  评论(0编辑  收藏  举报