Face API dengan node.js menggunakan Axios

Sep 19 2020

Saya menggunakan API Wajah layanan kognitif Azure untuk menganalisis gambar. Saya sudah membuatnya berfungsi sebelumnya menggunakan tautan url ke gambar tanpa masalah, tetapi saya mencoba membuatnya berfungsi dengan gambar lokal. Saya telah menemukan pertanyaan yang diajukan, itulah yang saya cari dengan a request.post, tetapi saya mencoba membuatnya bekerja dengan axios. Kode saya:

"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);
    });

Saya mengharapkan untuk mendapatkan hasil yang serupa dalam format json, tetapi saya mendapatkan status: 400, statusText: 'Bad Request'dan saya tidak yakin mengapa. Bantuan apa pun tentang ini akan dihargai.

Saya juga sudah mencoba

const imageBuffer = fs.readFileSync(file);

dan

const options = [
                "returnFaceId=true",
"returnFaceLandmarks=true",
"returnFaceAttributes=age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,accessories",
                ];
        urlApi = urlApi.concat("?", options.join("&"));
        axios.post(urlApi,
                   { body: imageBuffer},
                   {     headers: {
    "Content-Type": "application/octet-stream",
    "Ocp-Apim-Subscription-Key": subscriptionKey,
    "Content-Length": imageBuffer.length,
},
                    )

Tanggapan kesalahan mendetail: (Atas permintaan Jim Xu)

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'
}

Jawaban

2 JimXu Sep 21 2020 at 09:06

Jika Anda ingin berjalan Axiosdi lingkungan node, kita harus menggunakan Stream, Buffersebagai data tubuh permintaan. Untuk lebih jelasnya, silakan lihat di sini .

Sebagai contoh

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;
  });