使用 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))
}

代码说明:

  1. 构造 HTTP 请求: 使用 HttpPost 类创建 HTTP POST 请求对象。
  2. 构造请求头参数: 使用 Map 存储请求头参数,包括算法类型、访问密钥、请求时间等。
  3. 构造请求参数: 使用 Map 存储请求参数,包括 durationSeconds 和 policyContent,其中 policyContent 包含版本、声明等信息。
  4. 参数加签: 使用 HmacSignatureUtil.generateSign() 方法对请求参数进行签名,生成签名字符串。
  5. 设置自定义请求头: 将签名和其他请求头参数添加到请求对象中。
  6. 设置 HTTP 请求头: 设置 Content-Typeapplication/json,表明请求参数为 JSON 格式。
  7. 设置请求参数: 使用 StringEntity 类将 JSON 格式的请求参数封装到请求对象中。
  8. 发送请求: 使用 httpClient.execute() 方法发送 HTTP POST 请求。
  9. 处理响应: 处理服务器返回的响应。

注意:

  • 代码中使用 HmacSignatureUtil 类进行签名,请根据实际情况修改签名算法和参数。
  • 代码中使用的 akskurl 为示例值,请替换为实际的访问密钥、访问密钥秘钥和请求 URL。
  • 代码中的 propertiespolicyContent 结构可以根据实际需要进行调整。

总结:

本示例演示了如何使用 Apache HttpClient 库发送带签名的 HTTP POST 请求。通过构造请求头、请求体、签名生成和发送请求等步骤,可以实现安全的 API 调用。

使用 Apache HttpClient 发送带签名的 HTTP POST 请求

原文地址: https://www.cveoy.top/t/topic/Zwg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录