使用 Apache HttpClient 发送带签名的 HTTP POST 请求
使用 Apache HttpClient 发送带签名的 HTTP POST 请求
本示例演示如何使用 Apache HttpClient 库发送带签名的 HTTP POST 请求,包括构造请求头、请求体、签名生成和发送请求等步骤。
Java 代码示例:
// 构造 HTTP POST 请求
HttpPost httpPost = new HttpPost("url值");
// 构造请求头参数
Map<String, String> headerMap = new HashMap<>();
headerMap.put(HmacSignatureUtil.ALG, HmacSignatureUtil.ALG_TYPE);
headerMap.put(HmacSignatureUtil.AK, ak);
headerMap.put(HmacSignatureUtil.REQ_TIME, String.valueOf(System.currentTimeMillis()));
// 构造请求参数
Map<String, Object> paramMap = new HashMap<>();
// properties
Map<String, Object> properties = new LinkedHashMap<>();
// properties -> durationSeconds
properties.put("durationSeconds", 86400);
// properties -> policyContent
Map<String, Object> policyContent = new LinkedHashMap<>();
// policyContent -> version
policyContent.put("Version", "1");
// policyContent -> statement[]
Map<String, Object> statement = new LinkedHashMap<>();
statement.put("Effect", "Allow");
// statement -> action[]
List<String> actions = new ArrayList<>();
actions.add("* ");
statement.put("Action", actions);
// statement -> resource[]
List<String> resources = new ArrayList<>();
resources.add("wcs:oss:*:88860:*");
statement.put("Resource", resources);
// policyContent -> statement[]
List<Object> statements = new ArrayList<>();
statements.add(statement);
policyContent.put("Statement", statements);
// properties -> policyContent
properties.put("policyContent", policyContent);
paramMap.put("properties", properties);
// 参数加签,生成签名字符串
String sign = HmacSignatureUtil.generateSign(paramMap, headerMap, sk);
headerMap.put(HmacSignatureUtil.SIGN, sign);
// 设置自定义请求头
headerMap.keySet().forEach(key -> {
httpPost.addHeader(key, headerMap.get(key));
});
// 设置 HTTP 请求头
httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
// 设置请求参数
StringEntity entity = new StringEntity(JSONObject.toJSONString(paramMap), Charset.forName("UTF-8"));
httpPost.setEntity(entity);
// 发送请求
CloseableHttpResponse response = httpClient.execute(httpPost);
// 处理响应
// ...
Go 代码示例:
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)
func main() {
url := "url值"
client := &http.Client{
Timeout: time.Second * 10,
}
// 构造请求头参数
headerMap := make(map[string]string)
headerMap[HmacSignatureUtil.ALG] = HmacSignatureUtil.ALG_TYPE
headerMap[HmacSignatureUtil.AK] = ak
headerMap[HmacSignatureUtil.REQ_TIME] = fmt.Sprintf("%d", time.Now().UnixNano()/int64(time.Millisecond))
// 构造请求参数
paramMap := make(map[string]interface{})
// properties
properties := make(map[string]interface{})
// properties -> durationSeconds
properties["durationSeconds"] = 86400
// properties -> policyContent
policyContent := make(map[string]interface{})
// policyContent -> version
policyContent["Version"] = "1"
// policyContent -> statement[]
statements := make([]map[string]interface{}, 0)
// policyContent -> statement[] -> statement
statement := make(map[string]interface{})
statement["Effect"] = "Allow"
// statement -> action[]
actions := make([]string, 0)
actions = append(actions, "*")
statement["Action"] = actions
// statement -> resource[]
resources := make([]string, 0)
resources = append(resources, "wcs:oss:*:88860:*")
statement["Resource"] = resources
// policyContent -> statement[]
statements = append(statements, statement)
policyContent["Statement"] = statements
// properties -> policyContent
properties["policyContent"] = policyContent
paramMap["properties"] = properties
// 参数加签,生成签名字符串
sign := HmacSignatureUtil.generateSign(paramMap, headerMap, sk)
headerMap[HmacSignatureUtil.SIGN] = sign
// 设置自定义请求头
req, _ := http.NewRequest("POST", url, nil)
for key, value := range headerMap {
req.Header.Set(key, value)
}
// 设置 HTTP 请求头
req.Header.Set("Content-Type", "application/json")
// 设置请求参数
jsonData, _ := json.Marshal(paramMap)
req.Body = ioutil.NopCloser(bytes.NewReader(jsonData))
// 发送请求
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error:", err)
return
}
defer resp.Body.Close()
// 读取响应内容
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
代码说明:
- 构造 HTTP 请求: 使用
HttpPost类创建 HTTP POST 请求对象。 - 构造请求头参数: 使用
Map存储请求头参数,包括算法类型、访问密钥、请求时间等。 - 构造请求参数: 使用
Map存储请求参数,包括 durationSeconds 和 policyContent,其中 policyContent 包含版本、声明等信息。 - 参数加签: 使用
HmacSignatureUtil.generateSign()方法对请求参数进行签名,生成签名字符串。 - 设置自定义请求头: 将签名和其他请求头参数添加到请求对象中。
- 设置 HTTP 请求头: 设置
Content-Type为application/json,表明请求参数为 JSON 格式。 - 设置请求参数: 使用
StringEntity类将 JSON 格式的请求参数封装到请求对象中。 - 发送请求: 使用
httpClient.execute()方法发送 HTTP POST 请求。 - 处理响应: 处理服务器返回的响应。
注意:
- 代码中使用
HmacSignatureUtil类进行签名,请根据实际情况修改签名算法和参数。 - 代码中使用的
ak、sk和url为示例值,请替换为实际的访问密钥、访问密钥秘钥和请求 URL。 - 代码中的
properties和policyContent结构可以根据实际需要进行调整。
总结:
本示例演示了如何使用 Apache HttpClient 库发送带签名的 HTTP POST 请求。通过构造请求头、请求体、签名生成和发送请求等步骤,可以实现安全的 API 调用。
原文地址: https://www.cveoy.top/t/topic/Zwg 著作权归作者所有。请勿转载和采集!