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
相关文章推荐
- 使用HttpClient 发送get、post请求,及其解析xml返回数据
- java使用POST发送soap报文请求webservice返回500错误解析
- java ajax 请求后获取 json 数据 以及 使用 解析 ,解惑
- Java 中使用 HttpClient 发送 get、post 请求的方法
- 使用HttpClient发送http请求,并解析从服务器端返回的数据
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- 使用HttpClient来异步发送POST请求并解析GZIP回应
- 使用HttpClient发送http请求,并解析从服务器端返回的数据
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- wp8.1使用HttpClient发送post请求数据
- Java post请求发送json数据在filter中解析方法
- Java使用HttpClient发送请求的几种常用方式
- Android开发-使用Okhttp发送请求并解析服务器返回的数据
- 使用httpclient实现后台java发送post和get请求
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- 使用HttpClient来异步发送POST请求并解析GZIP回应
- httpClient使用,1 发送post请求 2 发送get请求取得接口中的数据
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- 关于java 发送http json数据格式请求时,服务器端如何接收json数据并解析
- Java使用HttpClient发送请求