HttpClient发送get/post请求
参考博客:https://www.cnblogs.com/LuckyBao/p/6096145.html
1.需要的maven依赖:
<!--httpClient需要的依赖--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency> <!--//httpclient缓存--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient-cache</artifactId> <version>4.5</version> </dependency> <!--//http的mime类型都在这里面--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.3.2</version> </dependency>
2.发送get请求
//使用httpClient发送get请求 public void sentGetMethod(){ //1.先创建httpClient对象,使用默认的方式即可 CloseableHttpClient httpClient= HttpClients.createDefault(); //2.设置url并且创建某种请求方式实例 //比如:(在百度上搜索helloworld出现的路径)url:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0 // &rsv_idx=1&tn=baidu&wd=helloworld&rsv_pq=c6735cf70000fe15 // &rsv_t=7e25dm7uzHpmOwrFNF33FXbom45Px0Bs0F8PP3Bcm8RMOysmKlfA%2FuqKoU4&rqlang=cn // &rsv_enter=1&rsv_sug3=9&rsv_sug1=5&rsv_sug7=101 //url的构建也可以使用字符串拼接的方式 try { URI url=new URIBuilder() .setScheme("https")//设置协议 .setHost("www.baidu.com") .setPath("/s") .setParameter("ie","utf-8") .setParameter("rsv_idx","1") .setParameter("tn","baidu") .setParameter("wd","helloworld") .setParameter("rsv_pq","c6735cf70000fe15") .setParameter("rsv_t","7e25dm7uzHpmOwrFNF33FXbom45Px0Bs0F8PP3Bcm8RMOysmKlfA%2FuqKoU4") .setParameter("rqlang","cn") .setParameter("rsv_enter","1") .setParameter("rsv_sug3","9") .setParameter("rsv_sug1","5") .setParameter("rsv_sug7","101") .build(); System.out.println(url); HttpGet httpGet=new HttpGet(url); InputStream inputStream=null; CloseableHttpResponse httpResponse=null; try { //3.执行httpClient httpResponse=httpClient.execute(httpGet); //可以输出请求的结果 System.out.println(httpResponse.getStatusLine().getStatusCode()); //4.获取相应的结果 //4.1使用EntityUtils.toString()方式 --不推荐 //2种方式只能2选一存在,会互相冲突 HttpEntity entity=httpResponse.getEntity(); //获取响应的实体 // if (entity!=null){ // System.out.println(EntityUtils.toString(entity,"utf-8")); // }else { // //如果entity为空,那么直接消化掉即可 // EntityUtils.consume(entity); // } System.out.println("------------------------我是美丽的分割线--------------------"); //4.2使用InputStream方式 --推建 inputStream=entity.getContent(); //转换成字符流 BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); String line=""; while ((line=bufferedReader.readLine())!=null){ System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }finally { //关闭InputStream和response if (inputStream!=null){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (httpResponse!=null){ try { httpResponse.close(); } catch (IOException e) { e.printStackTrace(); } ; } } } catch (URISyntaxException e) { e.printStackTrace(); } }
3.httpClient发送post请求(携带json数据)
//发送post请求 携带json数据的 public void sendPostMethod(String url){ //1.创建httpClient CloseableHttpClient httpClient=HttpClients.createDefault(); //2.创建post请求方式实例 HttpPost httpPost=new HttpPost(url); //2.1设置请求头 发送的是json数据格式 httpPost.setHeader("Content-type", "application/json;charset=utf-8"); httpPost.setHeader("Connection", "Close"); //3.设置参数---设置消息实体 也就是携带的数据 /* * 比如传递: * { "username": "aries", "password": "666666" } */ String jsonStr=" {\"username\":\"aries\",\"password\":\"666666\"}"; StringEntity entity = new StringEntity(jsonStr.toString(), Charset.forName("UTF-8")); entity.setContentEncoding("UTF-8"); //设置编码格式 // 发送Json格式的数据请求 entity.setContentType("application/json"); //把请求消息实体塞进去 httpPost.setEntity(entity); //4.执行http的post请求 CloseableHttpResponse httpResponse=null; InputStream inputStream=null; try { httpResponse=httpClient.execute(httpPost); //5.对返回的数据进行处理 //5.1判断是否成功 System.out.println(httpResponse.getStatusLine().getStatusCode()); //5.2对数据进行处理 HttpEntity httpEntity=httpResponse.getEntity(); inputStream=httpEntity.getContent(); //获取content实体内容 //封装成字符流来输出 BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); String line=""; while ((line=bufferedReader.readLine())!=null){ System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }finally { //6.关闭inputStream和httpResponse if (inputStream!=null){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (httpResponse!=null){ try { httpResponse.close(); } catch (IOException e) { e.printStackTrace(); } } } }
4.httpClient发送post请求/携带x-www-form-urlencoded数据格式
//发送post请求 携带非json数据 public void sendPostMethod1(String url) throws Exception { // 1、创建一个httpClient客户端对象 CloseableHttpClient httpClient=HttpClients.createDefault(); // 2、创建一个HttpPost请求 HttpPost httpPost = new HttpPost(url); //设置请求头 httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); //设置传输的数据格式 //携带普通的参数params的方式 List<NameValuePair> params=new ArrayList<>(); params.add(new BasicNameValuePair("username", "kylin")); params.add(new BasicNameValuePair("password", "123456")); String str=EntityUtils.toString(new UrlEncodedFormEntity(params,Consts.UTF_8)); //这里就是:username=kylin&password=123456 System.out.println(str); //放参数进post请求里面 从名字可以知道 这个类是专门处理x-www-form-urlencoded 添加参数的 httpPost.setEntity(new UrlEncodedFormEntity(params,"UTF-8")); // 7、执行post请求操作,并拿到结果 CloseableHttpResponse httpResponse = httpClient.execute(httpPost); // 获取结果实体 HttpEntity entity = httpResponse.getEntity(); if (entity != null) { //进行输出操作 这里就简单的使用EntityUtils工具类的toString()方法 System.out.println(EntityUtils.toString(entity,"UTF-8")); } else EntityUtils.consume(entity); //最后释放资源之类的 }
总结:
1.创建httpClient对象创建默认的对象就够使用了
2.创建某种请求方法的实例
例如有:get方式---- HttpGet
post方式-----HttpPost
put方式------HttpPut
delete方式 ------HttpDelete
3.如果有参数的话就设置参数
get请求:
方式1:使用URI类的方法来创建
方式2:直接使用字符串拼接那种
post请求:
使用setEntity()方式来携带不同的数据类型(需要设置)
4.发送请求
执行httpClient.execute() --返回CloseableHttpResponse对象
5.获取请求的结果
获取HttpEntity的实体之后,对http文档的查看
方式一:EntityUtils.toString(entity,"utf-8") 不推荐
方式二:使用InputStream类
6.关闭连接释放资源
先关闭inputStream
再关闭response