Java-浅析HttpURLConnection与HttpClient异同与其使用

 

1.HttpURLConnection与HttpClient是什么

     HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。

     在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能:HttpURLConnection。 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连接。

 

2.如何使用HttpURLConnection发送请求

      发送一个简单的Get请求。

HttpURLConnection-Get Collapse source

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

package test;

import java.io.BufferedReader;

import java.io.DataOutputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

public class HttpURLConnectionExample {

    private final String USER_AGENT = "Mozilla/5.0";

    // HTTP GET 请求

    private void sendGet() throws Exception {

        String url = "<a href="https://www.baidu.com/" "="" style="color: rgb(50, 108, 166); border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">https://www.baidu.com/";

        URL obj = new URL(url);

        HttpURLConnection con = (HttpURLConnection) obj.openConnection();

        // 默认就是为GET

        con.setRequestMethod("GET");

        //设置请求头

        con.setRequestProperty("User-Agent", USER_AGENT);

        int responseCode = con.getResponseCode();

        System.out.println("\nSending 'GET' request to URL : " + url);

        System.out.println("Response Code : " + responseCode);

        BufferedReader in = new BufferedReader(

                new InputStreamReader(con.getInputStream()));

        String inputLine;

        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {

            response.append(inputLine);

        }

        in.close();

        //打印一下结果

        System.out.println(response.toString());

    }

}

      发送一个简单的Post请求

HttpURLConncetion-Post Collapse source

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

package test;

import java.io.BufferedReader;

import java.io.DataOutputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

public class HttpURLConnectionExample {

    private final String USER_AGENT = "Mozilla/5.0";

 

    // HTTP POST 请求

    private void sendPost() throws Exception {

        String url = "http://localhost:8080/helpPage/upload";

        URL obj = new URL(url);

        HttpURLConnection con = (HttpURLConnection) obj.openConnection();

        //设置请求头

        con.setRequestMethod("POST");

        con.setRequestProperty("User-Agent", USER_AGENT);

        con.setRequestProperty("Accept-Language""en-US,en;q=0.5");

        String urlParameters = "laijunxin";

        // 发送请求

        con.setDoOutput(true);

        DataOutputStream wr = new DataOutputStream(con.getOutputStream());

        wr.writeBytes(urlParameters);

        wr.flush();

        wr.close();

        int responseCode = con.getResponseCode();

        System.out.println("\nSending 'POST' request to URL : " + url);

        System.out.println("Post parameters : " + urlParameters);

        System.out.println("Response Code : " + responseCode);

        BufferedReader in = new BufferedReader(

                new InputStreamReader(con.getInputStream()));

        String inputLine;

        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {

            response.append(inputLine);

        }

        in.close();

        //打印一下结果

        System.out.println(response.toString());

    }

}

      其实我们可以发现,步骤其实都差不多相同,打开Connection,设置好相应的URL,设置好参数和请求头,然后直接发送请求,发送完请求再将获取到的响应使用起来,做相应的处理就行了。

3.如何使用HttpClient发送请求

      因为其实之前做的项目中遇到的上传下载等功能其实用到的都HttpClient发送的请求居多,所以其实对HttpClient反倒是比较熟悉一点的。

      一个简单的Get请求例子。

HttpClient-Get Collapse source

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

package test;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.URL;

import java.net.URLConnection;

import java.util.List;

import java.util.Map;

import java.util.Scanner;

import org.apache.http.HttpResponse;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.HttpClients;

public class HttpClientTest {

    public static void dotest(){

        HttpClient client=HttpClients.createDefault();//创建HttpClient对象

        HttpGet httpGet=new HttpGet("http://localhost:8080/helpPage/upload");//创建Get请求

        HttpResponse response=null;

        try {

             response=client.execute(httpGet);//发送请求,并获取到响应

             Scanner s = new Scanner(response.getEntity().getContent()).useDelimiter("\\A");

             String result = s.hasNext() ? s.next() : "";//将响应中内容转换为字符串

             System.out.println(result);

        catch (ClientProtocolException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

      一个上传文件的Post请求例子。

HttpClient-Post Collapse source

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

package test;

import java.io.File;

import java.io.IOException;

import java.util.List;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.entity.ContentType;

import org.apache.http.entity.mime.MultipartEntityBuilder;

import org.apache.http.entity.mime.content.FileBody;

import org.apache.http.entity.mime.content.StringBody;

import org.apache.http.impl.client.DefaultHttpClient;

import bean.FileVersionInfo;

import com.fasterxml.jackson.databind.ObjectMapper;

public class Test{

    /**

     * 发送post请求的方法,请求包含文件信息和文件内容

     */

    public static void sendPost1(){

        HttpClient httpClient=new DefaultHttpClient();//创建HttpClient对象

        HttpPost post=new HttpPost("http://localhost:8080/helpPage/upload");//创建Post请求对象

        MultipartEntityBuilder builder=MultipartEntityBuilder.create();//创建多文件体对象

        ObjectMapper mapper = new ObjectMapper();

        try {

            builder.addPart("id",new StringBody("F:/testUpload",ContentType.TEXT_PLAIN));

            builder.addPart("HEHE"new FileBody(new File("F://test 1.docx")));

            builder.addPart("KEN66"new FileBody(new File("F://test 2.docx")));

            builder.addPart("拉拉"new FileBody(new File("F://test 3.docx")));//设置多文件体

            HttpEntity entity=builder.build();//创建请求实体

            post.setEntity(entity);//设置请求实体

            HttpResponse response=httpClient.execute(post);//发送请求

        catch (ClientProtocolException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

      其实中心步骤就是

  • 创建HttpClient对象
  • 创建请求对象
  • 设置请求内容
  • 发送请求
  • 使用响应

      两者相比较下来的话,个人觉得在简单的请求发送前提下,应该是Http比较简便占优势的,因为其内部已经封装好了很多相应的方法,但是HttpURLConnection可能比较适合自己按想法改动,具体的使用还需进一步的根据相应的情景来决定。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值