调用接口的方法,包括带证书的访问

本文介绍了一种HTTP请求实现方式,特别强调了如何通过配置连接和读取超时时间来控制请求过程,同时提供了使用证书进行安全连接的选项。代码示例展示了如何使用Java创建一个仅请求一次且不进行重试的HTTP客户端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
     * 请求,只请求一次,不做重试
     * @param data
     * @param connectTimeoutMs
     * @param readTimeoutMs
     * @param useCert 是否使用证书
     * @return
     * @throws Exception
     */
    public static String requestOnce(final String url , String data, int connectTimeoutMs, int readTimeoutMs, boolean useCert) throws Exception {
        BasicHttpClientConnectionManager connManager;
        if (useCert) {
            // 证书
            char[] password = mch_id.toCharArray();
            InputStream certStream = getCertStream();
            KeyStore ks = KeyStore.getInstance("PKCS12");
            ks.load(certStream, password);

            // 实例化密钥库 & 初始化密钥工厂
            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            kmf.init(ks, password);

            // 创建 SSLContext
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());

            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
                    sslContext,
                    new String[]{"TLSv1"},
                    null,
                    new DefaultHostnameVerifier());

            connManager = new BasicHttpClientConnectionManager(
                    RegistryBuilder.<ConnectionSocketFactory>create()
                            .register("http", PlainConnectionSocketFactory.getSocketFactory())
                            .register("https", sslConnectionSocketFactory)
                            .build(),
                    null,
                    null,
                    null
            );
        }
        else {
            connManager = new BasicHttpClientConnectionManager(
                    RegistryBuilder.<ConnectionSocketFactory>create()
                            .register("http", PlainConnectionSocketFactory.getSocketFactory())
                            .register("https", SSLConnectionSocketFactory.getSocketFactory())
                            .build(),
                    null,
                    null,
                    null
            );
        }

        HttpClient httpClient = HttpClientBuilder.create()
                .setConnectionManager(connManager)
                .build();

        HttpPost httpPost = new HttpPost(url);

        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(readTimeoutMs).setConnectTimeout(connectTimeoutMs).build();
        httpPost.setConfig(requestConfig);

        StringEntity postEntity = new StringEntity(data, "UTF-8");
        httpPost.addHeader("Content-Type", "text/xml");
        httpPost.addHeader("User-Agent", USER_AGENT );
        httpPost.setEntity(postEntity);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        return EntityUtils.toString(httpEntity, "UTF-8");

    }
### OpenBMC Web API 调用方法及示例 OpenBMC 提供了一种基于 Redfish 标准的 RESTful 接口来管理 BMC 设备。通过这些接口,可以实现对硬件状态监控、配置更改以及其他操作的支持。以下是有关如何调用 OpenBMC Web API 的详细介绍。 #### 1. 基本概念 OpenBMC 使用 HTTPS 协议提供了一个安全的 Web API 接口。该接口遵循 Redfish 标准[^1],允许开发者通过 HTTP 请求访问和控制设备的各种功能。API 支持的操作包括但不限于获取系统状态、设置 BIOS 配置参数、执行电源管理命令等。 #### 2. 认证方式 为了保护敏感数据并防止未授权访问,OpenBMC 实现了基本的身份验证机制 (Basic Authentication) 和 OAuth2.0 支持。通常情况下,客户端需要发送有用户名密码编码后的 Base64 字符串作为 `Authorization` 头部的一部分来进行身份认证: ```bash curl -k https://<bmc-ip>/redfish/v1/Systems/system \ -u root:password ``` 上述命令中的 `-u root:password` 表明使用默认账户登录到目标 BMC 系统上。注意替换 `<bmc-ip>` 及实际凭证信息以匹配具体环境需求。 #### 3. 获取系统信息 下面是一个简单的例子展示怎样利用 curl 工具查询当前系统的整体健康状况: ```bash curl -X GET "https://<bmc-ip>/redfish/v1/Chassis/System.Embedded.1" \ -H 'Content-Type: application/json' \ --basic --user "<username>:<password>" -k | jq . ``` 此请求返回 JSON 数据结构描述机箱物理属性及其子组件的状态详情,比如温度传感器读数或者风扇转速等等。 #### 4. 执行 IPMI 命令 除了标准红鱼协议外,还可以直接向 OpenBMC 发送 IPMI 类型的消息。例如重启服务器可以通过如下脚本来完成: ```cpp #include <iostream> #include <boost/beast.hpp> // For http request/response handling. using namespace boost::beast; // Define function prototype here... auto reboot_server(http_client &client){ json j = { {"ResetType", "ForceRestart"} }; auto res = client.post("/redfish/v1/Systems/system/Actions/ComputerSystem.Reset", serialize(j)); if(res.result_int() != 200 && res.result_int()!=204 ){ throw std::runtime_error("Failed to reset system."); } } ``` 这里展示了 C++ 中借助 Boost.Beast 库构建 POST 请求的过程,并指定动作路径 `/redfish/v1/Systems/system/Actions/ComputerSystem.Reset` 来触发强制重新启动事件[^3]。 #### 5. TLS 自动化处理 当涉及到更复杂的场景如上传 CA 或者生成新的 X.509 数字证书时,则可能需要用到额外的功能模块。BMCWeb 还提供了内置工具用于简化这一流程,在无需人工干预的情况下自动创建所需的密钥对与签名文件。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT界的奇葩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值