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

  • 相关阅读:
    XAF 有条件的对象访问权限
    XAF 顯示 UnInplace Report(設置自定義條件顯示報表,不是根據選擇ListView記錄條件顯示報表)
    XAF 如何自定义PivotGrid单元格显示文本?
    XAF 如何布局详细视图上的按钮
    XAF How to set size of a popup detail view
    XAF Delta Replication Module for Devexpress eXpressApp Framework
    XAF 帮助文档翻译 EasyTest Basics(基础)
    XAF 用户双击ListView记录时禁止显示DetailView
    XAF How to enable LayoutView mode in the GridControl in List Views
    XAF 如何实现ListView单元格批量更改?
  • 原文地址:https://www.cnblogs.com/wyqfighting/p/3009531.html
Copyright © 2011-2022 走看看