网络编程中,HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密的方式在计算机网络上进行安全通信的协议。网络传输协议,跟http相比更安全,因为他加上了SSL/TLS协议来加密通信内容。
Java调用HTTPS,需要与客户端建立连接,但是建立连接的时候,需要进行SSL认证。有的时候为了方便调用,我们会绕过SSL认证。但是在特定环境中,绕过SSL认证是十分不安全的,不推荐这么做。SSL认证是确保通信安全的重要手段,绕过认证的话可能带来一系列的安全问题。
所以一般绕过SSL认证不在生产环境中使用。
因为我本次调用HTTPS接口的目的是调用数据,存储在表中,不需要跨环境,只在本地执行,所以进行SSL认证稍有繁琐,所以我决定绕过SSL认证。
通过自定义SSL上下文的方式,绕过SSL认证的方式。通过自定义信任管理器,你可以在绕过证书验证的同时,实现自己的证书验证逻辑。这对于使用自签名证书或特定信任机制的情况很有用。
最后返回一个绕过SSL认证的 HttpClient对象。
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import CertificateException;
import X509Certificate;
import javax.ssl.HostnameVerifier;
import javax.ssl.SSLContext;
import org.ssl.NoopHostnameVerifier;
import org.ssl.SSLConnectionSocketFactory;
import org.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;// 创建自定义的 SSL 上下文,用于绕过证书验证public static CloseableHttpClient createSSLClientDefault() {try {SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {// 信任所有证书public boolean isTrusted(X509Certificate[] arg0, String arg1)throws CertificateException {return true;}}).build();// 创建主机名验证器,用于绕过主机名验证HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;// 创建 SSL 连接套接字工厂,将自定义的 SSL 上下文和主机名验证器应用于 HTTPS 连接SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);// 创建自定义的 CloseableHttpClient 实例,将 SSL 连接套接字工厂应用于 HTTP 客户端return HttpClients.custom().setSSLSocketFactory(sslsf).build();} catch (KeyManagementException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (KeyStoreException e) {e.printStackTrace();}ateDefault();}
该方法的实现逻辑如下:
TrustStrategy
来信任所有证书。NoopHostnameVerifier(主机名验证器)
意味着在SSL连接中不会对服务器的主机名进行验证。主机名验证器用于验证SSL证书中的主机名与服务器实际的主机名是否匹配。NoopHostnameVerifier
是一个空实现的主机名验证器,它绕过了主机名验证,即使主机名不匹配,也会继续进行SSL连接。SSLConnectionSocketFactory
指定自定义的主机名验证器(HostnameVerifier),以控制主机名验证的行为。CloseableHttpClient
实例,使用上述的 SSL 连接套接字工厂。CloseableHttpClient
实例。private static final String SERVICE_URL = "ip:port/api/v1/cipher/json/create";private static final String AUTHORIZATION_HEADER = "savhsdkfas==";public ReturnT<String> execute(String param) throws Exception {//发送httpPost请求//创建HttpClientHttpClient httpclient = ateSSLClientDefault();//发送接口地址HttpPost httppost = new HttpPost(SERVICE_URL);//设置请求体格式Content-Typehttppost.setHeader("Content-Type", "application/json");httppost.setHeader("Authorization", AUTHORIZATION_HEADER);//定义String请求Json参数体httppost.setEntity(new StringEntity(new String("{" +""keyCode": "" + keycode + ""," +""algorithmParam": "SM4/ECB/PKCS7Padding"," +""data": {" +""SetlNewDTO": "" + vertDtoToBase64(accountPayDO) + """ +"}" +"}"), Charset.forName("UTF-8")));//发送请求并接收responseHttpResponse httpresponse = ute(httppost);String result = Entity(), "UTF-8");ObjectMapper objectMapper = new ObjectMapper();JsonNode responseJson = adTree(result);// 从JSON对象中获取键值对,根据出参格式获取出参数据JsonNode jsonNode = ("data");JsonNode encData1 = ("encData");String encDate2 = String();}
这段代码是一个使用Apache HttpClient库发送HTTP POST请求的示例。它发送一个带有JSON参数的POST请求,并从响应中提取特定的数据。
代码中的execute
方法声明了抛出Exception
异常,它接收一个String
类型的参数param
,但实际上没有使用到该参数。
首先,代码定义了服务的URL和授权头信息。
然后,通过调用
接下来,创建一个HttpPost对象,并设置请求的URL和请求头信息。
然后,构造请求体的JSON参数,并设置到HttpPost对象中。
构造请求体的使用需要使用json格式参数,也可以直接使用 GJson json = new GJson(jsonStr);将非JSON数据转化为JSON格式,JSON格式的S他脸红,需要给每个参数加上引号,并且使用转译。所以setEntity的时候需要带有JSON格式的字符串。
String jsonStr = "{"name":"John","age":30,"city":"New York"}";GJson json = new GJson(jsonStr);
接着,通过调用HttpClient的execute
方法发送HttpPost请求,并接收HttpResponse响应。
将响应的实体内容转换为字符串,并存储在result
变量中。
使用Jackson库的ObjectMapper
类解析result
字符串为JsonNode对象。
从JsonNode对象中获取特定的数据,例如从"data"键中获取"encData"键的值。
最后,将获取到的"encData"值存储在encDate2
变量中。
我的出参是这样的,所以按照自己的格式替换数据,便可以得到你想要的出参
{"code": "0","message": "success","data": {"encData": {"date": "wxpOGSdQD68Jp7fC4KV"}}
}
需要注意的是,代码中的URL、授权头信息、JSON参数等是示例数据,你需要根据实际情况进行修改和替换。
此代码片段只是一个简单的示例,实际使用时应该考虑异常处理、资源释放等更完善的逻辑。
最高级的自律,从一点点到亿点点。
public WrapperResponse<List<WarningDTO>> queryBigWarning(WarnInfoBInfoQueryDTO warnInfoBInfoQueryDTO) throws Exception {String SERVICE_URL = "127.0.0.1:8889/wakljfa";//发送httpPost请求//创建HttpClientHttpClient httpclient = ateDefault();//发送接口地址HttpPost httppost = new HttpPost(SERVICE_URL);//定义String请求Json参数体httppost.setEntity(new StringEntity(new String("{" +""pageNum": "" + PageNum() + ""," +""pageSize": "" + PageSize() + ""," +""warnType": "" + WarnType() + """ +"}"), Charset.forName("UTF-8")));httppost.setHeader("Content-Type", "application/json");//发送请求并接收responseHttpResponse httpresponse = ute(httppost);String result = Entity(), "UTF-8");ObjectMapper objectMapper = new ObjectMapper();JsonNode responseJson = adTree(result);// 从JSON对象中获取键值对,根据出参格式获取出参数据JsonNode data = ("data");JsonNode listWarn = ("list");Iterator<JsonNode> iterator = listWarn.iterator();List<WarningDTO> warningDTOS = new ArrayList<>();while (iterator.hasNext()) {WarningDTO warningDTO = new WarningDTO();JsonNode warningNode = ();String warnOcurTime= ("warnOcurTime").asText();warningDTO.setWarnOcurTime(warnOcurTime);String warnId= ("warnId").asText();warningDTO.setWarnId( warnId);String id= ("id").asText();warningDTO.setId( Id);warningDTOS.add(warningDTO);}return WrapperResponse.success(warningDTOS);
}
"data": {"list": [{"warnId": "000000000000000000000000000201","warnOcurTime": 1672502400000,"id": "000000000000000000000000000201"},{"warnId": "000000000000000000000000000301","warnOcurTime": 1672502400000,"id": "000000000000000000000000000301"}]
}
(•̀ᴗ• ) ̑̑ 看到这的朋友。如果可以的话。点点下边的链接帮我投上两票哦。๐•ᴗ•๐✧๐•ᴗ•๐✧(•‿•)
掘金2023年度人气创作者打榜中,快来帮我打榜吧~ <=annual_2023&utm_medium=self_web_share&utm_source=Recently%E7%A5%9D%E7%A5%9D>
本文发布于:2024-01-30 18:00:29,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170660883321824.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |