使用Axios使用node.js进行Face API

问题描述

我正在使用Azure的认知服务Face API来分析图像。我已经通过使用指向图像的url链接来使其更早地工作了,但是我正在尝试使其与本地图像一起工作。我发现有一个question的问题,正是我在request.post中寻找的东西,但是我试图使其与axios一起使用。 我的代码:

"use strict";
const axios = require("axios").default;
const fs = require("fs");

let file = "localFile.jpg";

const imageBuffer = fs.readFileSync(file,{ encoding: "base64" });

// Add a valid subscription key and endpoint to your environment variables.
var subscriptionKey = "<Subscription key>";
var urlApi=
    "https://.../face/v1.0/detect";


// Send a POST request
axios({
    method: "post",url: urlApi,params: {
        returnFaceId: true,returnFaceLandmarks: false,returnFaceAttributes:
            "age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise",},headers: {
        "Content-Type": "application/octet-stream","Ocp-Apim-Subscription-Key": subscriptionKey,"Content-Length": imageBuffer.length,data: imageBuffer,})
    .then((response) => {
        console.log("Status text: " + response.status);
        console.log("Status text: " + response.statusText);
        console.log();
        //console.log(response.data)
        response.data.forEach((face) => {
            console.log("Face ID: " + face.faceId);

            console.log("Smile: " + face.faceAttributes.smile);
            console.log(
                "Head pose: " + JSON.stringify(face.faceAttributes.headPose)
            );
            console.log("Gender: " + face.faceAttributes.gender);
            console.log("Age: " + face.faceAttributes.age);
            console.log(
                "Facial hair: " + JSON.stringify(face.faceAttributes.facialHair)
            );
            console.log("Glasses: " + face.faceAttributes.glasses);
            console.log("Smile: " + face.faceAttributes.smile);
            console.log(
                "Emotion: " + JSON.stringify(face.faceAttributes.emotion)
            );
            console.log("Blur: " + JSON.stringify(face.faceAttributes.blur));
            console.log(
                "Exposure: " + JSON.stringify(face.faceAttributes.exposure)
            );
            console.log("Noise: " + JSON.stringify(face.faceAttributes.noise));
            console.log(
                "Makeup: " + JSON.stringify(face.faceAttributes.makeup)
            );
            console.log(
                "Accessories: " +
                    JSON.stringify(face.faceAttributes.accessories)
            );
            console.log("Hair: " + JSON.stringify(face.faceAttributes.hair));
            console.log();
        });
    })
    .catch(function (error) {
        console.log(error);
    });

我期望以json格式获得类似的输出,但是相反,我得到了status: 400,statusText: 'Bad Request',但不确定为什么。任何帮助,将不胜感激。

我也尝试过

const imageBuffer = fs.readFileSync(file);

const options = [
                "returnFaceId=true","returnFaceLandmarks=true","returnFaceAttributes=age,accessories",];
        urlApi = urlApi.concat("?",options.join("&"));
        axios.post(urlApi,{ body: imageBuffer},{     headers: {
    "Content-Type": "application/octet-stream",)

详细的错误响应:(应吉姆·徐的要求)

response: {
status: 400,statusText: 'Bad Request',headers: {
  'transfer-encoding': 'chunked','content-type': 'application/json; charset=utf-8','x-envoy-upstream-service-time': '8','apim-request-id': 'cb7f0380-a785-49f5-94fe-ff5ed0e36742','strict-transport-security': 'max-age=31536000; includeSubDomains; preload','x-content-type-options': 'nosniff','csp-billing-usage': 'CognitiveServices.Face.Transaction=1',date: 'Sun,20 Sep 2020 13:55:45 GMT',connection: 'close'
}

解决方法

如果要在节点环境中运行Axios,则应使用Stream,Buffer作为请求正文数据。有关更多详细信息,请参阅here

例如

axios
  .post(
    "<your face api endpoint>",fs.readFileSync("D:\\faces.jpg"),{
      headers: {
        "Ocp-Apim-Subscription-Key": subscriptionKey,"Content-Type": "application/octet-stream",},params: {
        returnFaceId: true,returnFaceLandmarks: false,returnFaceAttributes:
          "age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise",}
  )
  .then((response) => {
    console.log("Status text: " + response.status);
    console.log("Status text: " + response.statusText);
    console.log();
    //console.log(response.data)
    response.data.forEach((face) => {
      console.log("Face ID: " + face.faceId);
      console.log(
        "Face rectangle: " +
          face.faceRectangle.top +
          "," +
          face.faceRectangle.left +
          "," +
          face.faceRectangle.width +
          "," +
          face.faceRectangle.height
      );
      console.log("Smile: " + face.faceAttributes.smile);
      console.log("Head pose: " + JSON.stringify(face.faceAttributes.headPose));
      console.log("Gender: " + face.faceAttributes.gender);
      console.log("Age: " + face.faceAttributes.age);
      console.log(
        "Facial hair: " + JSON.stringify(face.faceAttributes.facialHair)
      );
      console.log("Glasses: " + face.faceAttributes.glasses);
      console.log("Smile: " + face.faceAttributes.smile);
      console.log("Emotion: " + JSON.stringify(face.faceAttributes.emotion));
      console.log("Blur: " + JSON.stringify(face.faceAttributes.blur));
      console.log("Exposure: " + JSON.stringify(face.faceAttributes.exposure));
      console.log("Noise: " + JSON.stringify(face.faceAttributes.noise));
      console.log("Makeup: " + JSON.stringify(face.faceAttributes.makeup));
      console.log(
        "Accessories: " + JSON.stringify(face.faceAttributes.accessories)
      );
      console.log("Hair: " + JSON.stringify(face.faceAttributes.hair));
      console.log();
    });
  })
  .catch((err) => {
    throw err;
  });

enter image description here

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...