发送带有图像URL的POST请求? ---针库

时间:2020-05-22 03:05:27

标签: node.js rest microsoft-cognitive needle.js

尝试找出使用Node.js Needle library向API发送RESTful请求的正确方法。我认为除了有关图片网址的代码外,其他所有内容都正确。无论我如何尝试更改其外观或放置位置,都会不断收到错误消息,指出它是无效图像,但不是,URL很好。因此,我的猜测是我的代码是错误的,因此它认为图像的URL可能不是URL(但可能是其他代码或应位于主体/图像URL所在位置的代码)。 / p>

const imageUrl = 'https://upload.wikimedia.org/wikipedia/commons/3/37/Dagestani_man_and_woman.jpg'

// Request parameters.
const params = {
    returnFaceId: true,
    returnFaceLandmarks: false,
    returnFaceAttributes: 'age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise'
}

var options = {
    body: '{"url": ' + '"' + imageUrl + '"}',
    headers: {
        'Content-Type': 'application/json',
        'Ocp-Apim-Subscription-Key': subscriptionKey
    }
}

needle.post(endpoint, params, options, function (err, res, body) {
    console.log(`Status: ${res.statusCode}`)
    console.log('Body: ', body)
    console.log('ERROR: ' + err)
    //console.log(res)
})

我还尝试将主体写为普通的ol'对象:body = { 'url': imageURL},但仍然遇到相同的错误。

错误:

Status: 400
Body:  { error: { code: 'InvalidURL', message: 'Invalid image URL.' } }

这是我要调用的API,已确认可与其他示例一起使用: https://westus.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236

1 个答案:

答案 0 :(得分:0)

对于此请求,您可以使用参数的组合:

  • 其中一些作为查询字符串(您的“ params”)
  • 其中一些作为身体载荷(您的options.body)

因此,您似乎无法直接使用needle.post,因为它可以查询字符串参数或主体参数,但不能同时查询两者。

所以有几种选择:

  • 在“ URL”字段中设置查询字符串参数
  • 更改您的lib

对于第一个选项,下面是一个示例:

const imageUrl = 'https://upload.wikimedia.org/wikipedia/commons/3/37/Dagestani_man_and_woman.jpg'

// Request parameters.
const params = {
    returnFaceId: true,
    returnFaceLandmarks: false,
    returnFaceAttributes: 'age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise'
}

// Adding params to query string
serialize = function(obj) {
    var str = [];
    for (var p in obj)
      if (obj.hasOwnProperty(p)) {
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
      }
    return str.join("&");
}

endpoint = endpoint + "?" + serialize(params)

// Setting body and options
var body = '{ "url": ' + '"' + imageUrl + '"}'

var options = {
    headers: {
        'Content-Type': 'application/json',
        'Ocp-Apim-Subscription-Key': subscriptionKey
    }
}

needle.post(endpoint, body, options, function (err, res, body) {
    console.log(`Status: ${res.statusCode}`)
    console.log('Body: ', body)
    console.log('ERROR: ' + err)
    //console.log(res)
})