HttpClient和HttpURLConnection对比

  初学WebService调用涉及到java发送http请求,项目中用到的是Httpclient,找了资料整理一下:

HttpClient简介

    在一般情况下,如果只是需要向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的使用


使用HttpClient发送请求、接收响应很简单,只要如下几步即可。

创建HttpClient对象。
如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HttpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。


  使用HttpClient发送 以post方式发送http请求访问本地应用并根据传递参数不同返回不同结果 :

public void post() {  
        // 创建默认的httpClient实例.    
        CloseableHttpClient httpclient = HttpClients.createDefault();  
        // 创建httppost    
        HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");  
        // 创建参数队列    
        List<namevaluepair> formparams = new ArrayList<namevaluepair>();  
        formparams.add(new BasicNameValuePair("type", "house"));  
        UrlEncodedFormEntity uefEntity;  
        try {  
            uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");  
            httppost.setEntity(uefEntity);  
            System.out.println("executing request " + httppost.getURI());  
            CloseableHttpResponse response = httpclient.execute(httppost);  
            try {  
                HttpEntity entity = response.getEntity();  
                if (entity != null) {  
                    System.out.println("--------------------------------------");  
                    System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));  
                    System.out.println("--------------------------------------");  
                }  
            } finally {  
                response.close();  
            }  
        } catch (ClientProtocolException e) {  
            e.printStackTrace();  
        } catch (UnsupportedEncodingException e1) {  
            e1.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            // 关闭连接,释放资源    
            try {  
                httpclient.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  

 
 

 HttpURLConnection以post方式发送http请求:

public static void main(String[] args) {
         try {
             // 1. 获取访问地址URL
             URL url = new URL("http://localhost:8080/Servlet/do_login.do");
             // 2. 创建HttpURLConnection对象
             HttpURLConnection connection = (HttpURLConnection) url
                     .openConnection();
             /* 3. 设置请求参数等 */
             // 请求方式
             connection.setRequestMethod("POST");
             // 超时时间
             connection.setConnectTimeout(3000);
             // 设置是否输出
             connection.setDoOutput(true);
             // 设置是否读入
             connection.setDoInput(true);
             // 设置是否使用缓存
            connection.setUseCaches(false);
             // 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向
             connection.setInstanceFollowRedirects(true);
             // 设置使用标准编码格式编码参数的名-值对
             connection.setRequestProperty("Content-Type",
                     "application/x-www-form-urlencoded");
             // 连接
             connection.connect();
             /* 4. 处理输入输出 */
             // 写入参数到请求中
             String params = "username=test&password=123456";
             OutputStream out = connection.getOutputStream();
             out.write(params.getBytes());
             out.flush();
            out.close();
            // 从连接中读取响应信息
             String msg = "";
             int code = connection.getResponseCode();
             if (code == 200) {
                 BufferedReader reader = new BufferedReader(
                         new InputStreamReader(connection.getInputStream()));
                 String line;
 
                 while ((line = reader.readLine()) != null) {
                     msg += line + "\n";
                 }
                 reader.close();
             }
             // 5. 断开连接
             connection.disconnect();

             // 处理结果
             System.out.println(msg);
         } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
             e.printStackTrace();
        }
     }

说明:

HttpURLConnection对象不能直接构造,需要通过URL类中的openConnection()方法来获得。

HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的TCP连接,并没有实际发送HTTP请求。HTTP请求实际上直到我们获取服务器响应数据(如调用getInputStream()、getResponseCode()等方法)时才正式发送出去。

对HttpURLConnection对象的配置都需要在connect()方法执行之前完成。

HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。

HTTP正文的内容是通过OutputStream流写入的, 向流中写入的数据不会立即发送到网络,而是存在于内存缓冲区中,待流关闭时,根据写入的内容生成HTTP正文。

调用getInputStream()方法时,返回一个输入流,用于从中读取服务器对于HTTP请求的返回信息。

我们可以使用HttpURLConnection.connect()方法手动的发送一个HTTP请求,但是如果要获取HTTP响应的时候,请求就会自动的发起,比如我们使用HttpURLConnection.getInputStream()方法的时候,所以完全没有必要调用connect()方法。

猜你喜欢

转载自blog.csdn.net/qq_29569183/article/details/79913506