在使用HttpClient
进行java端调用http请求时候,发现有流式组件fluent-hc
可以直接用,是对HttpClient
的简单封装
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
</dependency>
该代码实现的功能是发送HTTP请求并带有签名验证。具体步骤如下:
- 初始化一个SignatureUtils.SignatureParam对象,并设置签名头部信息。
- 打印参数信息。
- 创建一个默认的CloseableHttpClient对象。
- 创建一个HttpPost对象,并设置请求的URL。
- 根据请求方法不同,构建不同类型的请求对象(GET、POST、PUT)。
- 设置请求头部信息,包括随机生成的Bhc-Gateway-Nonce、自定义的headerMap、请求方法、请求路径、查询参数、签名盐、api-style、Bhc-Gateway-Client-Id、Bhc-Gateway-Timestamp等。
- 使用SignatureUtils对SignatureParam进行签名,得到签名信息。
- 设置请求头部的Bhc-Gateway-Signature为签名信息。
- 执行请求,并返回响应内容。
注意:代码中的一些变量和方法调用没有提供完整的上下文,因此无法完全理解其含义和作用。
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();
}