说明:记录一次使用kong.unirest发起http请求,添加请求头的坑。
场景
发起一个http请求,需要带上签名等请求头,如下:
java
@Override
protected String run() {
String dataString = JSON.toJSONString(data);
String signature = 加密工具,生成签名(signPrivateKey, dataString);
// 将签名放到请求头中
Unirest.config().getDefaultHeaders().add("sign", sign);
HttpResponse<String> response = Unirest.post(url.toString())
.queryString("type", type)
.contentType(ContentType.APPLICATION_JSON.toString())
.body(dataString)
.asString();
if (response.isSuccess()) {
return "调用成功";
}
throw new Exception("调用失败");
}
我使用 Unirest.config().getDefaultHeaders().add("sign", sign); 的方式,将数据加到请求头上的。然后在调试时,发现首次通过验证后,后面取签名验证,都验证不通过,很疑惑。
解决
增加打印日志后,发现除了首次,后面传递过去的签名请求头 sign 都是首次的数据。而看我上面的代码,是需要根据每次的数据内容,产生签名,然后加到请求头上。就是说,后面产生的sign,没有覆盖上一次请求的sign。
不能用上面这种方式,要用下面这种:
java
@Override
protected String run() {
String dataString = JSON.toJSONString(data);
String signature = 加密工具,生成签名(signPrivateKey, dataString);
HttpResponse<String> response = Unirest.post(url.toString())
.queryString("type", type)
.contentType(ContentType.APPLICATION_JSON.toString())
.header("sign", sign)
.body(dataString)
.asString();
if (response.isSuccess()) {
return "调用成功";
}
throw new Exception("调用失败");
}
添加请求头,要放到Unirest.post发起调用时