Java使用httpClient发送请求与数据的解析(有案例)

一、httpClient的介绍

HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

二、使用httpClient发送请求

httpClient专为java发送http请求而生的, 如果要使用httpClient ,需要先进行导包。

<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.5.6</version>
</dependency>

1、发送get请求

@Test
    public void testGet() throws Exception {
    
    
        //确定首页url
        String indexUrl = "http://www.baidu.com";
        //发送请求,获取数据
        //创建HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //创建http方法对象
        HttpGet httpGet = new HttpGet(indexUrl);
        //设置请求头
        httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36");
        //发送请求,获取响应的数据
        CloseableHttpResponse response = httpClient.execute(httpGet);
        //获取请求的响应码
        if(response.getStatusLine().getStatusCode()==200){
    
    
            Header[] headers = response.getHeaders("Content-Type");
            //System.out.println(headers[0].getValue());
            //获取响应体
            HttpEntity httpEntity = response.getEntity();
            System.out.println(EntityUtils.toString(httpEntity,"GB2312"));
        }
    }

2、发送post请求

@Test
    public void testPost() throws Exception{
    
    
        //1.确定URL
        String indexURl = "https://www.chsi.com.cn/";
        //2.发送请求,获取数据
        //创建请求方法对象
        HttpPost httpPost = new HttpPost(indexURl);
        //设置请求头
        httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36");
        //设置请求体
        List<BasicNameValuePair> list = new ArrayList();
        list.add(new BasicNameValuePair("username","liang"));
        list.add(new BasicNameValuePair("password","123"));
        HttpEntity requestEntity = new UrlEncodedFormEntity(list);
        httpPost.setEntity(requestEntity);
        //创建请求对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //发送请求获取数据
        CloseableHttpResponse response = httpClient.execute(httpPost);
        //判断是否请求成功
        System.out.println(response.getStatusLine().getStatusCode());
        if(response.getStatusLine().getStatusCode()==200){
    
    
            HttpEntity entity = response.getEntity();
            System.out.println(EntityUtils.toString(entity,"UTF-8"));
        }
    }

3、总结httpClient使用步骤:
导包确定首页URL创建httpClient对象: HttpClients.createDefault()设置请求方式: HttpGet HttpPost设置请求参数和请求头发送请求获取响应对象CloseableHttpResponse response = httpClient.execute(get/post)获取数据:响应行 响应头 响应体

其中post设置参数的方式为:

	List list = new ArrayList();
	list.add(new BasicNameValuePair("username","rose"));
	list.add(new BasicNameValuePair("password","123"));
	HttpEntity entity = new UrlEncodedFormEntity(list);
	httpPost.setEntity(entity);

三、解析响应数据

解析数据本质上就是在解析HTML文档,jsjQuery 就可以解析HTML文档, 但是 jsjQuery 是前端的技术, 而目前HTML代码存储在 java 代码中, 故无法使用 jsjQuery 来解析HTML文档。那么需要使用一种可以在 java 客户端来解析HTML文档的技术 ------jsoup

jsoup 是一款java解析HTML文档的工具, 如果要使用 jsoup 需要先进行导包。

<dependency>
	<groupId>org.jsoup</groupId>
	<artifactId>jsoup</artifactId>
	<version>1.10.3</version>
</dependency>

解析数据: 获取首页中目前开设的课程的内容
jsoup 在进行解析HTML文档的时候提供了两套API:
1、基于 js 的方式来解析HTML文档: 需要程序员熟悉 js 的API. 大大提高程序员的学习成本
2、基于 css 或者 jQuery 的选择器来解析HTML文档。

使用原生 js 的方式解析HTML文档

@Test
    public void test1() throws Exception {
    
    
        Document document = Jsoup.connect("http://www.ujiuye.com").get();
        //获取所有的学科
        //获取页面中的ul元素
        Element ulEl = document.getElementsByClass("nav_left").get(0);
        //获取ul下的所有的li
        Elements lis = ulEl.getElementsByTag("li");
        //循环lis
        for (Element li : lis) {
    
    
            Element a = li.getElementsByTag("a").get(0);
            System.out.println(a.text());
        }
    }

打印输出的结果如下:

Java开发
Python+人工智能
大前端 (H5+小程序+服务器渲染)
全链路UI/UE设计
大数据
软件测试
Linux云计算
VR/AR游戏开发
网络安全
互联网营销
全域电商运营
新媒体与短视频运营
直播带货
三维可视化设计
智能机器人软件开发
嵌入式物联网
PHP开发
认证考试

使用选择器的方式解析数据

@Test
    public void test2() throws Exception {
    
    
        //获取文档对象
        Document document = Jsoup.connect("http://www.ujiuye.com").get();
        //获取所有的学科
        Elements elements = document.select(".nav_left>li>a>span");
        for (Element element : elements) {
    
    
            System.out.println(element.text());
        }
    }

总结: jsoup 常用方法
1、 parse(String html) :获取document对象。
2、select("选择器"): 根据指定的选择器获取元素。
3、text()/html():获取内容体的数据, text方法获取文本内容 html方法主要使用用来获取文本+html内容。
4、attr(String key): 根据指定属性名称获取属性值。

四、案例

需求: 模拟登陆慢慢买这个网址, 登陆成功以后, 获取当前用户的积分信息。

登陆的url: http://home.manmanbuy.com/login.aspx
访问这个url的相关参数: __VIEWSTATE__EVENTVALIDATIONtxtUsertxtPassbtnLogin

@Test
    public void test3() throws IOException {
    
    
        //1. 确定首页URL
        String  loginUrl = "http://home.manmanbuy.com/login.aspx";
        //2. 发送请求, 获取数据
        //2.1 创建httpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //2.2 设置请求方式
        HttpPost httpPost = new HttpPost(loginUrl);
        //2.3 封装请求参数
        List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();
        list.add(new BasicNameValuePair("__VIEWSTATE","/wEPDwULLTIwNjQ3Mzk2NDFkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQlhdXRvTG9naW4voj01ABewCkGpFHsMsZvOn9mEZg=="));
        list.add(new BasicNameValuePair("__EVENTVALIDATION","/wEWBQLW+t7HAwLB2tiHDgLKw6LdBQKWuuO2AgKC3IeGDJ4BlQgowBQGYQvtxzS54yrOdnbC"));
        list.add(new BasicNameValuePair("txtUser","itcast"));
        list.add(new BasicNameValuePair("txtPass","www.itcast.cn"));
        list.add(new BasicNameValuePair("btnLogin","登陆"));
        HttpEntity entity = new UrlEncodedFormEntity(list);
        httpPost.setEntity(entity);
        //2.4 封装请求头: referer
        httpPost.setHeader("Referer","http://home.manmanbuy.com/login.aspx");
        //2.5 发送请求, 获取响应对象
        CloseableHttpResponse response = httpClient.execute(httpPost);
        //2.6 获取数据
        //2.6.1 :状态码
        int statusCode = response.getStatusLine().getStatusCode();
        if(statusCode==302){
    
    
            //登陆成功, 获取重定向URL
            Header[] locations = response.getHeaders("Location");
            String reUrl = locations[0].getValue();
            reUrl = "http://home.manmanbuy.com"+reUrl;
            Header[] cookies = response.getHeaders("Set-Cookie");
            //System.out.println(headers.length);
            httpClient = HttpClients.createDefault();
            HttpGet httpGet = new HttpGet(reUrl);
            //封装登陆成功的cookie标识信息
            httpGet.setHeader("Cookie",cookies[0].getValue()+" "+cookies[1].getValue());
            //重定向后的response的对象
            response = httpClient.execute(httpGet);
            //重定向后的页面的数据
            String html = EntityUtils.toString(response.getEntity(), "UTF-8");
            //解析HTML的数据
            Document document = Jsoup.parse(html);
            Elements jiFenEl = document.select("#aspnetForm > div.udivright > div:nth-child(2) > table > tbody > tr > td:nth-child(1) > table:nth-child(2) > tbody > tr > td:nth-child(2) > div:nth-child(1) > font");
            System.out.println(jiFenEl.text());
        }
    }

打印输出结果如下:

12

猜你喜欢

转载自blog.csdn.net/cczxcce/article/details/107810197