Java如何使用httpclient检测url状态及链接是否能打开
作者:西凉的悲伤 发布时间:2022-07-03 21:23:25
标签:Java,httpclient,url
使用httpclient检测url状态及链接是否能打开
有时候我们需要检测某个url返回的状态码是不是200或者页面能不能正常打开响应可使用如下代码:
需要使用到的maven
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.14</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
代码:
public static String checkUrlConnection(String url) {
// 创建http POST请求
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("Content-Type", "application/json");
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(600)// 设置连接主机服务超时时间
.setConnectionRequestTimeout(1000)// 设置连接请求超时时间
.setSocketTimeout(1000)// 设置读取数据连接超时时间
.build();
// 为httpPost实例设置配置
httpGet.setConfig(requestConfig);
// 设置请求头
CloseableHttpClient httpclient = null;
CloseableHttpResponse response = null;
int statusCode = 404;
try {
httpclient = HttpClients.createDefault();// 创建Httpclient对象
response = httpclient.execute(httpGet);// 执行请求
statusCode = response.getStatusLine().getStatusCode();
}catch (SocketException e) {
return "404";
} catch (IOException e) {
System.out.println("报错");
return "404";
}
return String.valueOf(statusCode);
}
HTTPClient调用远程URL实例
案例描述
一次项目中后端服务需要从微信小程序获取扫码关注次数,网上搜各种示例都不太好用(代码冗余且效果不佳),于是自己花功夫做了一套。
public interface CustomerAppointAPIService {
String getApiToken(JSONObject json);
JSONObject getFollowNum(JSONObject SaleId);
void updateFacoriteCountRealitys();
}
package com.faw.xxx.modules.staff.service.impl;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.faw.xxx.modules.staff.dao.DsCepStaffDAO;
import com.faw.xxx.modules.staff.entity.DsCepStaff;
import com.faw.xxx.modules.staff.service.CustomerAppointAPIService;
import com.faw.xxx.utils.SSLClient;
import cn.hutool.core.codec.Base64;
@Service
public class CustomerAppointAPIServiceImpl implements CustomerAppointAPIService {
@Autowired
private DsCepStaffDAO dsCepStaffDAO;
/**
* 授权接口
* 参数格式:
*{
*"Client":"digital_xxx",//客户端标识
*"Secret":"@-!xxx"//客户端接入秘钥
*}
*/
@Override
public String getApiToken(JSONObject json) {
HttpClient httpClient = null;
HttpPost httpPost = null;
String body = null;
String postData = JSON.toJSONString(json);
String encryptData=Base64.encode(postData);
JSONObject params = new JSONObject();
params.put("request", encryptData);
String url = "https://miniappxxx.xxx.com.cn/api/v1/APIToken/GetApiToken";
try{
httpClient = new SSLClient();
httpPost = new HttpPost(url);
httpPost.addHeader("Content-type", "application/json; charset=utf-8");
// httpPost.addHeader("Authorization", head);
httpPost.setHeader("Accept", "application/json");
httpPost.setEntity(new StringEntity(params.toJSONString(), "UTF-8"));
HttpResponse response = httpClient.execute(httpPost);
if(response != null){
HttpEntity resEntity = response.getEntity();
if(resEntity != null){
body = EntityUtils.toString(resEntity,"utf-8");
}
}
}catch(Exception ex){
ex.printStackTrace();
}
JSONObject result = JSON.parseObject(body);
JSONObject msgData = result.getJSONObject("msg");
//接口直接返回token,以便于下一个接口调用
return msgData.get("Token").toString();
}
/**
* 微信小程序关注次数接口,POST请求
*/
@Override
public JSONObject getFollowNum(JSONObject SaleId) {
HttpClient httpClient = null;
HttpPost httpPost = null;
String body = null;
String postData = JSON.toJSONString(SaleId);
String encryptData = Base64.encode(postData);
JSONObject params = new JSONObject();
params.put("request", encryptData);
String json = "{\"Client\":\"digital_xxx\",\"Secret\":\"@-!6xxx\"}";
String token = this.getApiToken(JSON.parseObject(json));
String url = "https://miniappxxx.xxx.com.cn/api/v2/WechatApi/xxxNum";
try{
httpClient = new SSLClient();
httpPost = new HttpPost(url);
httpPost.addHeader("Content-type", "application/json; charset=utf-8");
httpPost.addHeader("Authorization", "bearer " + token);
httpPost.setHeader("Accept", "application/json");
httpPost.setEntity(new StringEntity(params.toJSONString(), "UTF-8"));
HttpResponse response = httpClient.execute(httpPost);
if(response != null){
HttpEntity resEntity = response.getEntity();
if(resEntity != null){
body = EntityUtils.toString(resEntity,"utf-8");
}
}
}catch(Exception ex){
ex.printStackTrace();
}
JSONObject result = JSON.parseObject(body);
JSONObject resultData = new JSONObject();
resultData.put("code", result.get("code"));
resultData.put("data", result.get("data"));
return resultData;
}
//更新所有在职销售顾问实际被关注数,此接口涉及内部代码,不做详解
@Override
@Transactional
public void updateFacoriteCountRealitys() {
//获取所有在职员工列表
List<DsCepStaff> dsCepStaffs = dsCepStaffDAO.getAllOnPost();
if (dsCepStaffs.size()>0) {
for (DsCepStaff dsCepStaff : dsCepStaffs) {
//更新销售顾问实际被关注数
JSONObject SaleId = new JSONObject();
SaleId.put("SaleId", dsCepStaff.getStaffId());
JSONObject resultData = this.getFollowNum(SaleId);
if (resultData != null) {
Integer facoriteCountReality = Integer.parseInt(resultData.get("data").toString());
dsCepStaffDAO.updateFacoriteCountRealityByStaffId(facoriteCountReality, dsCepStaff.getStaffId());
}
}
}
}
}
package com.faw.xxx.utils;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* 用于进行Https请求的HttpClient
* @author user
*
*/
public class SSLClient extends DefaultHttpClient {
public SSLClient() throws Exception{
super();
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
ctx.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ClientConnectionManager ccm = this.getConnectionManager();
SchemeRegistry sr = ccm.getSchemeRegistry();
sr.register(new Scheme("https", 443, ssf));
}
}
来源:https://blog.csdn.net/qq_33697094/article/details/119870749


猜你喜欢
- 一. 线程池简介1. 线程池的概念:线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建
- CyclicBarrier 接着讲多线程下的其他组件,第一个要讲的就
- 前提:你的电脑是AMD处理器,想使用Android studio,自己的电脑系统是win10家庭版,在百度找到勾选hyper-v就能用,然后
- 如下所示:package com.lstc.test;public class TestDemo3 {String str = new St
- 前言首先,我们要讲的是JVM的垃圾回收机制,我默认准备阅读本篇的人都知道以下两点:JVM是做什么的Java堆是什么因为我们即将要讲的就是发生
- 前言前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑。当然了,优化是无止境的,前人栽树后人乘凉。作为我们
- 开发中遇到Eclipse报错:java.lang.OutOfMemoryError: PermGen space。PermGen space
- 本文实例讲述了Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法。分享给大家供大家参考,具体如下
- IoC——Inversion of Control,控制反转在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控
- (1)我们在访问Android的离线文档,是非常慢的,由于需要加载一些图片或者是动态的脚本语言js代码,网上的解决方法是删除所有的js含有链
- 1.简述:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = &q
- java中Hashmap的get方法map中存储的是键值对,也就是说通过set方法进行参数和值的存储,之后通过get“键”的形式进行值的读取
- 通用配置#下面介绍的整合JDBC和整合MyBatis都需要添加的实体类和配置数据库表#CREATE TABLE `user` ( `id`
- 1、StatefulWidget的背后flutter开发过程中,我们经常会用到两个组件StatelessWidget和StatefulWid
- 引入spring-cloud-starter-openfeign失败引入下面jar包总是报错jar包丢失<dependency>
- 这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速
- persistence.xml配置文件修改存放路径今天整合Spring、struts2和Spring Data JPA的时候遇到以下问题,现
- 说道线程,肯定会想到使用 java.lang.Thread.java这个类那么创建线程也主要有2种方式第一种方式:public class
- 定义:简单绑定是将一个用户界面元素(控件)的属性绑定到一个类型(对象)实例上的某个属性的方法。基本类型、包装类型、数组(以参数a
- 1、在ActionSupport中有一个validate()方法,这个方法是验证方法,它会在execute()方法执行之前执行,所以能够起到