axios await/async で受信した画像を application/octet-stream でAzure Face APIに送るメモ
axios await/async で受信した画像を application/octet-stream でAzure Face APIに送るメモです。
https://www.1ft-seabass.jp/memo/2020/04/19/azure-face-api-nodejs-axios-await-async/
こちらは、JSONデータでURLを指定して送るやり方でした。
今回は Azure Face API で application/octet-stream で送る方法をやってみます。
使うであろうシチュエーション
以前の記事のAzure Face APIでURLの画像指定ができないもの。公開されていない画像がターゲットです。
たとえば、LINE BOTのメッセージ画像のような何かしらのサービス内や、画像の取得には一定の設定が必要でセキュアな場所に置かれた画像が想定されます。
今回のサンプルは、その辺は端折って、Gyazo APIで取得したものを使います。これだと、公開URLなので取得できちゃうんですけど、本来は、先ほどお伝えしたようにクローズドな画像と考えてください。
axios Request Config が大事だった
大事なのは、Request Configで受信データのタイプを設定できるところです。今回は arraybuffer が適切でした。
この設定を行って、画像を読んだときのそのままのデータをAzure Face APIに application/octet-stream で送ればすんなり送れました。
以下の axios の説明です。

他の設定も面白そう。
サンプルソース
実際のコードはこちらです。
今回は、Gyazo APIで取得したものを使います。
Azure Face APIの部分は、Azure Face APIに公開画像URLを知らせる以前の記事 と同じ対応をします。
ということで、 `` の部分は Azure Face API キー と置き換えてください。
// axiosライブラリを呼び出す
const axios = require('axios');
// 実際にデータを取得する getRequest 関数
async function getRequest() {
// 何かしらの画像ファイルをAPIから読み込む ///////////////////////////////////////////////////////////////////////
// 例えば Gyazo の画像
const IMAGE_URL = 'https://i.gyazo.com/~~~~~~~~~~~~~~~~~~~~~~~~~~~.png';
let responseImageAPI;
try {
// axios はRequest Configで受信データのタイプを設定できる。今回は arraybuffer が適切。
responseImageAPI = await axios.get(IMAGE_URL,{responseType: 'arraybuffer'});
console.log('image data get');
} catch (error) {
console.log("post Error");
console.error(error);
}
// Face API ///////////////////////////////////////////////////////////////////////
// エンドポイント
// 米国西部2の場合は West US 2 なので、 westus2.api.cognitive.microsoft.com
//
// 設定
// returnFaceId true
// recognitionModel detection_02
// detectionModel detection_02
const FACE_API_ENDPOINT_URL = 'https://westus2.api.cognitive.microsoft.com/face/v1.0/detect?returnFaceId=true&returnFaceLandmarks=false&recognitionModel=recognition_02&returnRecognitionModel=false&detectionModel=detection_02';
// サブスクリプションをOcp-Apim-Subscription-Keyヘッダーに
// JSONで送るのでContent-typeヘッダーにapplication/octet-stream指定
const config = {
url: FACE_API_ENDPOINT_URL,
method: 'post',
headers: {
'Content-type': 'application/octet-stream',
'Ocp-Apim-Subscription-Key':''
},
data: responseImageAPI.data
};
// axios
try {
// POSTリクエストで送る
const responseAzure = await axios.request(config);
console.log('post OK');
// データ送信が成功するとレスポンスが来る
console.log(responseAzure.data);
} catch (error) {
console.log('post Error');
// ダメなときはエラー
console.error(error);
}
}
// getRequest を呼び出してデータを読み込む
getRequest();
こちらで、無事、判定が返ってきました。
