發(fā)送 HTTP 請(qǐng)求(NodeJS)
本文介紹 API 訂閱方應(yīng)用如何使用 NodeJS 語(yǔ)言發(fā)送 HTTP 請(qǐng)求接入網(wǎng)關(guān)。
前提條件
在進(jìn)行本地應(yīng)用開(kāi)發(fā)前,您需要確保已經(jīng)完成以下操作:
已在 API 網(wǎng)關(guān)控制臺(tái)創(chuàng)建了一個(gè)應(yīng)用,參見(jiàn) 創(chuàng)建應(yīng)用。
已將該應(yīng)用的 APPID 提供給了 API 發(fā)布者,并獲得了授權(quán),參見(jiàn) 授權(quán) API。
已獲取了如下服務(wù)配置信息。具體獲取方法,參見(jiàn) 獲取服務(wù)端信息。
應(yīng)用的訪問(wèn)密鑰(Access Key/Secret Key)
API 的域名地址(host)、請(qǐng)求路徑(path)、方法(method)、請(qǐng)求體(body)
操作步驟
發(fā)送請(qǐng)求到網(wǎng)關(guān)本質(zhì)上就是一個(gè)簡(jiǎn)單的 HTTP 請(qǐng)求,但是由于當(dāng)前 API 網(wǎng)關(guān)要求訂閱方必須加簽,所以在發(fā)起 HTTP 請(qǐng)求之前,您需要生成一個(gè)加簽信息,并加入請(qǐng)求 Header 中。
從網(wǎng)關(guān)獲取訂閱方應(yīng)用的密鑰(Access Key/Secret Key)。
獲取 API 的 host、method、path,并組裝好必要的參數(shù)。
引入
sofa-signature-js
,對(duì)請(qǐng)求進(jìn)行加簽。若拉取不到 sofa-signature-js 則執(zhí)行
npm i sofa-signature-js
下載。訪問(wèn) https://www.npmjs.com/package/sofa-signature-js 執(zhí)行命令 npm 拉取。
組裝請(qǐng)求。
使用 HttpClient(fetch、axios 等)發(fā)起 HTTP 請(qǐng)求到 API 網(wǎng)關(guān)。
NodeJS 代碼示例
import {
Signature,
SignatureAlgorithm,
HTTPDigestWithBase64,
DigestAlgorithm
} from "sofa-signature-js";
import fetch from 'node-fetch';
// api 信息
const gateway = "5jzkcn0idt3w****.apigateway.inc.alipay.net";
const method = "POST";
const path = "/simple/demo";
const headers = {
'Content-Type': 'application/json'
};
const body = JSON.stringify({
name:'jack',
});
// app ak
const accesskey = "m9hoHiqtjylG****";
// app sk
const secretkey = "sxCg1uk6UjGARr1hPswE0W2KHe86****";
let digest;
// 為 request body 生成 digest,可以保證 request body 不被篡改
if(method !== 'GET' && method !== 'DELETE'){
digest = HTTPDigestWithBase64(DigestAlgorithm.HMACSHA256, body);
}else{
digest = 'SHA-256=47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU='
}
headers["digest"] = digest;
// 創(chuàng)建加簽對(duì)象
const sign = new Signature(
accesskey,
secretkey,
SignatureAlgorithm.HMACSHA256,
signheaders
);
// signheaders 決定對(duì)哪些 header 進(jìn)行加簽
const signheaders = ["(request-target)", "digest"];
// 生成簽名
const authorization = sign.doSignature(secretkey, headers, method, path);
// 將簽名放到 header
headers["Signature"] = authorization;
// 發(fā)起請(qǐng)求
fetch(`${gateway}${path}`,{
method,
headers,
body
})
.then(function(res) {
return res.json();
})