java http basic 请求_3-Java发起http、https请求!厉害!适用所有类型url,包括权限验证 Basic Authentication...

2023-05-16

背景

现在需要请求一个https的接口,是请求docker仓库所有镜像的,但是接口需要账户密码验证,并不是那种Get里写username、password的方式,行不通,需要这种方式写

https://abcd:123456@mydocker.beacool.com/v2/_catalog

这种写法呢,我也是第一次见,帐户名:abcd, 密码:123456,这个url直接放在谷歌浏览器上会弹出输入账户密码,然后输入账户密码就行了

2fa7a013b518?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

图片.png

用postman也可以运行,但是昨天可以的,今天突然就不行了。。。。WTF???

本来呢,我是打算用vue写前端调用的,但是有跨域问题解决不了,那只能用Java写了

开始

好嘛,本以为是个很简单的http/https请求,

1然后用普通的HttpClient发现不行,教程网上一堆!

2用springboot的Resttemplate,发起get请求也不行!!

参考 https://blog.csdn.net/xiekuntarena/article/details/82108795

3然后各种百度,发现这是权限问题,账户密码直接写在url里不行,账户密码要写在UsernamePasswordCredentials类里,发现依然不行!!!!!!!

参考 https://blog.csdn.net/qq_15783243/article/details/78684423

和 https://www.cnblogs.com/diyunpeng/p/4394373.html

//该网页需要认证(用户名、密码)

HttpClientContext context = new HttpClientContext();

CredentialsProvider credentialsProvider = new BasicCredentialsProvider();

credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("beacool", "beacool4321"));

context.setCredentialsProvider(credentialsProvider);

CloseableHttpResponse execute = client.execute(get, context);

以上方法对于一般的url都是可以的,但是对我这种(变态的)url都不行,全部报如下错误

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1611)

at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)

at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1035)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:124)

at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)

at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1139)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)

at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)

at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)

at sun.net.www.protocol.https.HttpsURLConne

解决办法

pom文件,jdk1.8(1.6以上就行)

org.apache.httpcomponents

httpclient

4.5.2

通用类代码

package com.beacool;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.config.Registry;

import org.apache.http.config.RegistryBuilder;

import org.apache.http.conn.socket.ConnectionSocketFactory;

import org.apache.http.conn.socket.PlainConnectionSocketFactory;

import org.apache.http.conn.ssl.NoopHostnameVerifier;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.conn.ssl.SSLContextBuilder;

import org.apache.http.conn.ssl.TrustStrategy;

import org.apache.http.entity.StringEntity;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClientBuilder;

import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

import org.apache.http.util.EntityUtils;

import javax.net.ssl.HostnameVerifier;

import javax.net.ssl.SSLContext;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

/**

* 发起http、https请求,

* 发起https请求时会信任所有证书

* 支持带有账户密码验证的URL,如这种URL:https://abc:1234@www.aaaa.com/v2/_catalog

*/

public class HttpsClientUtil {

private static CloseableHttpClient acceptsUntrustedCertsHttpClient() throws Exception {

HttpClientBuilder b = HttpClientBuilder.create();

//内部类

SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {

public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {

return true;

}

}).build();

b.setSslcontext( sslContext);

// 不获取主机名

// 如果您不想削弱,请使用sslconnectionsocketfactory.getdefaulthostnameverfier()

HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;

// 特殊部分:

// -- 创建SSL套接字工厂,以使用我们削弱的“信任策略”。

// -- 创建一个注册表注册它

SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext,hostnameVerifier);

Registry socketFactoryRegistry = RegistryBuilder.create()

.register("http", PlainConnectionSocketFactory.getSocketFactory())

.register("https",sslSocketFactory)

.build();

/*创建一个http客户端连接管理池

* 现在,我们使用注册表创建连接管理器。

允许多线程的使用*/

PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager(socketFactoryRegistry);

b.setConnectionManager( connMgr);

// 最后,创建一个httpclient类

CloseableHttpClient client = b.build();

return client;

}

/**

*

* @param url https://....

* @param jsonStr 数据

* @param charset 字符集

* @return

*/

public static String doPost(String url, String jsonStr, String charset){

HttpClient httpClient = null;

HttpPost httpPost = null;

String result = null;

try{

httpClient = acceptsUntrustedCertsHttpClient(); //jdk1.6用法

//httpClient = new SSLClient(); //一般用法

httpPost = new HttpPost(url);

StringEntity entity = new StringEntity(jsonStr,charset);

httpPost.setEntity(entity);

HttpResponse response = httpClient.execute(httpPost);

if(response != null){

HttpEntity resEntity = response.getEntity();

if(resEntity != null){

result = EntityUtils.toString(resEntity,charset);

}

}

}catch(Exception ex){

ex.printStackTrace();

}

return result;

}

public static String doGet(String url){

HttpClient httpClient = null;

HttpGet httpGet = null;

String result = null;

try{

httpClient = acceptsUntrustedCertsHttpClient(); //jdk1.6用法

//httpClient = new SSLClient(); //一般用法

httpGet = new HttpGet(url);

HttpResponse response = httpClient.execute(httpGet);

if(response != null){

HttpEntity resEntity = response.getEntity();

if(resEntity != null){

result = EntityUtils.toString(resEntity);

}

}

}catch(Exception ex){

ex.printStackTrace();

}

System.out.println("========="+result);

return result;

}

}

调用方式

HttpsClientUtil.doGet("https://abcd:123456@mydocker.beacool.com/v2/_catalog");

//这个你们可以直接拿来测试

HttpsClientUtil.doGet("https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13524017352");

这个通用类可以说是很牛皮了,支持所有类型的url,不管是http还是https. POST、GET都行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java http basic 请求_3-Java发起http、https请求!厉害!适用所有类型url,包括权限验证 Basic Authentication... 的相关文章

随机推荐

  • 使用libcurl 建立长连接

    libcurl 是一个用于网络传输的开源库 xff0c 它支持多种协议 xff0c 包括 HTTP 要使用 libcurl 建立长连接 xff0c 需要设置 CURLOPT CONNECT ONLY 选项 这将告诉 libcurl 只建立连
  • C++ char* 转 char[] 给出示例代码

    char 转 char 的示例代码如下 xff1a span class hljs meta span class hljs keyword include span span class hljs string lt iostream g
  • socket的select的用法

    select 是一个用于在多个套接字上进行非阻塞 I O 操作的函数 它可以同时监视多个套接字 xff0c 并在有数据可读 可写或有错误发生时返回 该函数的语法如下 xff1a span class hljs function span c
  • python爬虫登录网页

    爬虫登录网页是指使用爬虫程序自动模拟登录流程 获取网站的数据 在 Python 中登录网页 需要使用第三方库如 requests mechanicalsoup 或者 selenium 等来实现 具体实现方法可以参考以下步骤 导入所需库 如
  • 只能选择分卷文件的第1部分_科普一下:天下无优分卷压缩附件的解压方法

    天下无优网优资料分享平台 https netopt net 处于性能考虑 xff0c 对所有上传的附件进行了10MB的附件大小限制 如果要分享超过10MB的文件 xff0c 我们推荐了使用 分卷压缩 的方式将一个大文件拆分并压缩成多个10M
  • 计算机存储器组成结构,计算机组成原理——存储器内部组成

    存储器的基本组成 这里讨论的是主存 xff0c 即内存 存储器 组成结构图 JPG 主存储器包括存储体 MAR MDR 各种逻辑部件及控制电路 存储器内部结构说明 一个主存储器 内存条 由多个存储体组成 xff0c 一个存储体中有许多存储单
  • doris和hive的区别

    Doris和Hive是两种开源的数据仓库工具 xff0c 都可以用来分析大型数据集 Doris是由阿里巴巴开发的一款大数据分析工具 xff0c 具有低延迟 高吞吐 高可扩展性等优点 它采用PAL Parallel amp Analytic
  • 如何安装chatgpt

    首先 xff0c 你需要确保你的计算机安装了 Python 环境 如果没有安装 xff0c 请参考以下网址进行安装 xff1a https www python org downloads 然后 xff0c 打开命令行窗口 在 Window
  • AttributeError: module 'numpy' has no attribute 'int'

    这个错误消息表明 xff0c 你试图访问 numpy 模块的 int 属性 xff0c 但是 numpy 模块中没有这个属性 这通常是因为你的代码中有一个语法错误 xff0c 导致 Python 解释器识别错误 具体来说 xff0c 可能是
  • listview多条目加载

    public class MyBaseAdapter extends BaseAdapter private Context context private ArrayList lt JsonBean DataBean Liketeamli
  • tensorboard怎么使用

    TensorBoard 是一个由 TensorFlow 提供的可视化工具 xff0c 可以帮助用户更好地理解和调试深度学习模型 使用 TensorBoard xff0c 您可以可视化训练过程中的损失和指标 模型结构 梯度直方图 嵌入向量等等
  • 写一段java主动发送请求的示例代码

    String url 61 34 http example com example php 34 try URL obj 61 new URL url HttpURLConnection con 61 HttpURLConnection o
  • idea chatGPT 插件 如何使用

    IDEA ChatGPT 插件是一个使用 OpenAI 的 GPT 3 模型的插件 xff0c 它能够帮助您生成代码 xff0c 提供代码自动完成和错误修复功能 要使用该插件 xff0c 您需要先在 IDEA 中安装插件 您可以在 IDEA
  • mybatisplus使用LambdaQueryWrapper查询时怎么将查询结果中所有的id放入数组中

    可以使用LambdaQueryWrapper的listObjs方法来查询数据库中所有符合条件的记录的某一个字段 xff0c 并将这些字段值放入一个数组中 具体实现方法如下 xff1a span class hljs built in Lis
  • 编写一个C语言程序,能够实现求斐波那契数列

    好的 这是一个实现求斐波那契数列的C语言程序 span class hljs meta span class hljs keyword include span span class hljs string lt stdio h gt sp
  • 添加数据库

    public class MySqlite extends SQLiteOpenHelper public MySqlite Context context super context 34 MyInfo 34 null 2 public
  • LINUX COUT没有定义,'cout'不是'std'的成员并且'cout'未在此范围内声明

    我意识到有几个像这样的重复项 xff0c 但是迄今为止他们都没有为我工作 我想在Ubuntu上使用g 43 43 编译C 43 43 非常简单的程序 xff0c 但它给我的范围错误 39 cout 39 不是 39 std 39 的成员并且
  • gpio_typedef_stm32库函数GPIO_Init()解析

    首先是引脚定义 define GPIO Pin 0 uint16 t 0x0001 Pin 0 selected define GPIO Pin 1 uint16 t 0x0002 Pin 1 selected define GPIO Pi
  • c语言串口程序编写,用C语言编写串口程序

    在当今 流行的编程软件种类繁多 xff0c 它们编程方便 易于维护 xff0c 但是在与硬 件直接打交道和编制系统软件时却束手无策 xff0c 于是C语言就有了用武之地 C语言 作为汇编语言与高级语言之间的一种过渡语言 xff0c 兼有汇编
  • java http basic 请求_3-Java发起http、https请求!厉害!适用所有类型url,包括权限验证 Basic Authentication...

    背景 现在需要请求一个https的接口 是请求docker仓库所有镜像的 xff0c 但是接口需要账户密码验证 xff0c 并不是那种Get里写username password的方式 xff0c 行不通 xff0c 需要这种方式写 htt