zoukankan      html  css  js  c++  java
  • 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协议的相关操作。

  • 相关阅读:
    nginx 配置7层代理
    还用老套路分析财务数据?这3种财务分析方法,你一定得看看
    nginx 4层代理
    【手绘漫画】面试必考之手撕单链表(解题模板和深度剖析),(LeetCode 707)
    连载三:Oracle升级文档大全
    隐私保护与价值挖掘之利器
    PTA刷题笔记(C语言) | 7-42 整除光棍 (20分)
    django 页面缓存
    C++建议
    读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
  • 原文地址:https://www.cnblogs.com/wyqfighting/p/3009531.html
Copyright © 2011-2022 走看看