网关以及签名问题HttpClient

在使用HttpClient进行java端调用http请求时候,发现有流式组件fluent-hc可以直接用,是对HttpClient的简单封装

<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>fluent-hc</artifactId>
        </dependency>

该代码实现的功能是发送HTTP请求并带有签名验证。具体步骤如下:

  1. 初始化一个SignatureUtils.SignatureParam对象,并设置签名头部信息。
  2. 打印参数信息。
  3. 创建一个默认的CloseableHttpClient对象。
  4. 创建一个HttpPost对象,并设置请求的URL。
  5. 根据请求方法不同,构建不同类型的请求对象(GET、POST、PUT)。
  6. 设置请求头部信息,包括随机生成的Bhc-Gateway-Nonce、自定义的headerMap、请求方法、请求路径、查询参数、签名盐、api-style、Bhc-Gateway-Client-Id、Bhc-Gateway-Timestamp等。
  7. 使用SignatureUtils对SignatureParam进行签名,得到签名信息。
  8. 设置请求头部的Bhc-Gateway-Signature为签名信息。
  9. 执行请求,并返回响应内容。

注意:代码中的一些变量和方法调用没有提供完整的上下文,因此无法完全理解其含义和作用。

   private String requestWithSignature(String path, RequestMethodEnum method, Map<String, Object> params, Object obj, Map<String, String> headerMap) {
        // init
        SignatureUtils.SignatureParam signatureParam = new SignatureUtils.SignatureParam();
        signatureParam.setSignatureHeaders(new HashMap<>(1));
        System.out.println("params " + obj);


        // 1.创建HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
//        // 方式二:通过builder 来构建(二者均可)
//        CloseableHttpClient build = HttpClientBuilder.create().build();

        // 创建Http请求
        String url = "https://bhc-gateway.guahao-test.com/bhc/upms/oauth/token";
        HttpPost httpPost = new HttpPost(url);

        Request request;
        //build request
        switch (method) {
            case GET:
                request = Request.Get(apiGatewayProperties.getServerUrl() + buildGetParam(path, params))
                        .setHeader("Bhc-Gateway-Signature-Headers", "api-style;");


                signatureParam.setBody(StringUtils.EMPTY.getBytes(StandardCharsets.UTF_8));
                //request.setHeader("content-type", "application/json; charset=utf-8");
                break;
            case POST:
                request = Request.Post(apiGatewayProperties.getServerUrl() + buildGetParam(path, params));
                this.resoleRequestBody(request, signatureParam, obj);
                break;
            case PUT:
                request = Request.Put(apiGatewayProperties.getServerUrl() + buildGetParam(path, params));
                this.resoleRequestBody(request, signatureParam, obj);
                break;
            default:
                throw ErrorCode.REQUEST_METHOD_ILLEGAL.failure(method.name());
        }
        // request.setHeader("Bhc-Gateway-Token", accessToken);
        request.setHeader("Bhc-Gateway-Nonce", UUID.randomUUID().toString());
        if (MapUtils.isNotEmpty(headerMap)) {
            headerMap.forEach(request::setHeader);
        }
        signatureParam.setMethod(method.name());
        signatureParam.setUri(path);
        signatureParam.setQueryString(buildGetParam(params));
        signatureParam.setSignatureSalt(apiGatewayProperties.getSignatureSalt());

        request.setHeader("api-style", "1");
        signatureParam.getSignatureHeaders().put("api-style", "1");

        request.setHeader("Bhc-Gateway-Client-Id", apiGatewayProperties.getClientId());
        //   request.setHeader("Bhc-Gateway-Authentication-Client-Id", apiGatewayProperties.getClientId());
        signatureParam.setClientId(apiGatewayProperties.getClientId());

        String timestamp = String.valueOf(System.currentTimeMillis());
        request.setHeader("Bhc-Gateway-Timestamp", timestamp);
        signatureParam.setTimestamp(timestamp);

//        SignatureUtils.SignatureInfo signatureInfo = SignatureUtils.signature(signatureParam);
        SignatureUtils.SignatureInfo signatureInfo = SignatureUtils.SignatureInfo.signature(signatureParam);
        request.setHeader("Bhc-Gateway-Signature", signatureInfo.getSignature());
        log.debug("signatureParam:" + signatureParam);
        log.debug("signatureInfo:" + signatureInfo);
        log.debug("request:" + request);
        return request.connectTimeout(DEFAULT_CONNECT_TIMEOUT).socketTimeout(DEFAULT_SOCKET_TIMEOUT)
                .execute().returnContent().asString();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值