zoukankan      html  css  js  c++  java
  • HTTP访问的两种方式:HttpURLConnection和HTTPClient的比较

     http://blog.sina.com.cn/s/blog_87216a0001014sm7.html

    http://www.2cto.com/kf/201305/208770.html

    ------------------------------------------------------------

    http://superonion.iteye.com/blog/1545496

      HttpURLConnection是java的标准类,HttpURLConnection继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了如下便捷的方法:

    • int getResponseCode():获取服务器的响应代码。
    • String getResponseMessage():获取服务器的响应消息。
    • String getResponseMethod():获取发送请求的方法。
    • void setRequestMethod(String method):设置发送请求的方法。

           在一般情况下,如果只是需要Web站点的某个简单页面提交请求并获取服务器响应,HttpURLConnection完全可以胜任。但在绝大部分情况下,Web站点的网页可能没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面。在这种情况下,就需要涉及Session、Cookie的处理了,如果打算使用HttpURLConnection来处理这些细节,当然也是可能实现的,只是处理起来难度就大了。

           为了更好地处理向Web站点请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。但不会缓存服务器的响应,不能执行HTML页面中嵌入的Javascript代码;也不会对页面内容进行任何解析、处理。

           简单来说,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收
    响应,以及管理HTTP连接。
           使用HttpClient发送请求、接收响应很简单,只要如下几步即可。
     
    1. 创建HttpClient对象。
    2. 如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
    3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
    4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
    5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
           另外,Android已经成功地集成了HttpClient,这意味着开发人员可以直接在Android应用中使用Httpclient来访问提交请求、接收响应。
     
    比如一个Android应用需要向指定页面发送请求,但该页面并不是一个简单的页面,只有当用户已经登录,而且登录用户的用户名有效时才可访问该页面。如果使用HttpURLConnection来访问这个被保护的页面,那么需要处理的细节就太复杂了。
           其实访问Web应用中被保护的页面,使用浏览器则十分简单,用户通过系统提供的登录页面登录系统,浏览器会负责维护与服务器之间的Sesion,如果用户登录的用户名、密码符合要求,就可以访问被保护资源了。
           在Android应用程序中,则可使用HttpClient来登录系统,只要应用程序使用同一个HttpClient发送请求,HttpClient会自动维护与服务器之间的Session状态,也就是说程序第一次使用HttpClient登录系统后,接下来使用HttpClient即可访问被保护页而了。
    --------------------------------------------------------------

    1.概念      

          HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能:HttpURLConnection。但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。

          除此之外,在Android中,androidSDK中集成了Apache的HttpClient模块,用来提供高效的、最新的、功能丰富的支持 HTTP 协议工具包,并且它支持 HTTP 协议最新的版本和建议。使用HttpClient可以快速开发出功能强大的Http程序。

    2.区别

    HttpClient是个很不错的开源框架,封装了访问http的请求头,参数,内容体,响应等等,

    HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等。

    http://hi.baidu.com/wendaoeryu/item/fc2264add98fbde614329bf0

    -------------------------------------------------------------------------

    使用HttpClient:

    NameValuePair nameValuePair1 = new BasicNameValuePair("name", "yang");

    NameValuePair nameValuePair2 = new BasicNameValuePair("pwd","123123");

    List nameValuePairs = new ArrayList();

    nameValuePairs.add(nameValuePair1);

    nameValuePairs.add(nameValuePair2);

    String validateURL = "http://10.0.2.2:8080/testhttp1/TestServlet";

    try {

            HttpParams httpParams = new BasicHttpParams();

            HttpConnectionParams.setConnectionTimeout(httpParams,5000); //设置连接超时为5秒

            HttpClient client = new DefaultHttpClient(httpParams); // 生成一个http客户端发送请求对象

            HttpPost httpPost = new HttpPost(urlString); //设定请求方式

              if (nameValuePairs!=null && nameValuePairs.size()!=0) {

                  //把键值对进行编码操作并放入HttpEntity对象中

                  httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));

               }

            HttpResponse httpResponse = client.execute(httpPost); // 发送请求并等待响应

              // 判断网络连接是否成功

              if (httpResponse.getStatusLine().getStatusCode() != 200) {

                 System.out.println("网络错误异常!!!!");

                 return false;

               }

            HttpEntity entity = httpResponse.getEntity(); // 获取响应里面的内容

            inputStream = entity.getContent();  // 得到服务气端发回的响应的内容(都在一个流里面)

            // 得到服务气端发回的响应的内容(都在一个字符串里面)

            // String strResult = EntityUtils.toString(entity); 

          } catch (Exception e) {

       System.out.println("这是异常!");

      }

    使用HttpURLConnection:

    String validateURL="http://10.0.2.2:8080/testhttp1/TestServlet?name=yang&pwd=123123";

    try {

           URL url = new URL(validateUrl); //创建URL对象

           //返回一个URLConnection对象,它表示到URL所引用的远程对象的连接

           HttpURLConnection conn = (HttpURLConnection) url.openConnection();

           conn.setConnectTimeout(5000); //设置连接超时为5秒

           conn.setRequestMethod("GET"); //设定请求方式

           conn.connect(); //建立到远程对象的实际连接

           //返回打开连接读取的输入流

           DataInputStream dis = new DataInputStream(conn.getInputStream());  

          //判断是否正常响应数据 

            if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {

               System.out.println("网络错误异常!!!!");

               return  false;

           }

    } catch (Exception e) {

       e.printStackTrace();

       System.out.println("这是异常!");

      } finally {

        if (conn != null) {

         conn.disconnect(); //中断连接

        }

  • 相关阅读:
    好久不见(致win7)
    mysql update
    两个日期相差的天数
    java 文件指针复位
    shell编程: 获得目录下(包括子目录)所有文件名,路径和文件大小
    爬虫(2)
    爬虫
    eclipse 创建dynamic web project不能运行
    JSP Servlet之间交换数据
    html5视频播放插件
  • 原文地址:https://www.cnblogs.com/navy-wang/p/3660554.html
Copyright © 2011-2022 走看看