您的位置:首页 > 编程语言 > Java开发

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

2020-08-12 15:51 1286 查看

一、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文档,

js
jQuery
就可以解析HTML文档, 但是
js
jQuery
是前端的技术, 而目前HTML代码存储在
java
代码中, 故无法使用
js
jQuery
来解析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
__EVENTVALIDATION
txtUser
txtPass
btnLogin

@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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: