【问题标题】:How to translate CURL -F @filename to nodejs如何将 CURL -F @filename 转换为 nodejs
【发布时间】:2018-06-25 00:33:28
【问题描述】:

我必须在 nodejs javascript 中翻译一个有效的 curl 请求。我确实成功完成了之前不暗示文件传输的类似查询。

curl --compressed -u $username:$password https://analysiscenter.veracode.com/api/5.0/uploadfile.do -F "app_id=1" -F "file=@package.zip"

我当前的,不工作的代码:

const fetch = require("node-fetch")

const b = new Buffer(myUsername + ":" + myPassword)
const s = b.toString('base64')

let uploadFileForm = new FormData()
uploadFileForm.append('app_id', "1")
uploadFileForm.append('file', fs.createReadStream('package.zip'))

header = {
    "Authorization": `Basic ${s}`,
    "Content-Type": 'multipart/form-data; boundary=' + form.getBoundary()
}

fetch("https://analysiscenter.veracode.com/api/4.0/uploadfile.do",
    {
        method: 'POST',
        header,
        body: uploadFileForm
    })
    .then(res => {
        return res.text()
    })
    .then(body => {
        console.log(body)
    })

我使用相同的身份验证过程来调用其他请求的 api。

更新

按照建议,我更改了代码以在标题中设置边界。现在标题看起来像这样:

{ Authorization: 'Basic anVsaWVuLmZleWV1eEAzZHMuY29tOjVZQzA1RlVlTmpBNWdGZF5EMVRYMEQyJFNrTEdNTA==',
  'content-type': 'multipart/form-data; boundary=--------------------------439864217372737605994368' }

还是不行

【问题讨论】:

  • 我认为你通过显式指定 Content-Type: multipart/form-data 来搞砸了这个标题需要包含用于分隔发送的不同表单参数的边界 - 但因为你正在设置这个标头自己,没有任何边界,接收端缺少此值。尝试根本不指定该标头(我希望节点足够聪明,可以自动设置此标头,并包含使用的边界。)
  • 非常感谢您的回答。我不认为该节点在没有您要求的情况下设置任何标题。我试着按照你说的做并删除标题,但它没有改变结果。
  • 那么您必须检查是否可以以某种方式从正文 (uploadFileForm) 中提取使用的边界值,以便您可以自己将其添加到标题中。
  • @CBroe 我刚刚按照您的建议更新了代码。无效,再次感谢您的帮助
  • 那么我建议您先将其发送到您自己的脚本,在其中记录标头和请求正文 - 然后您可以比较您的 cURL 请求和您的节点获取尝试...

标签: javascript node.js curl veracode node-fetch


【解决方案1】:

分辨率:

问题是一个小的 js 错误,因为 node-fetch 期望 headers 而我提供了 header

但是由于缺少节点“网络”调试工具,这很难看到。

我使用另一台服务器检查了最终的请求标头并了解出了什么问题。

再次感谢 @CBroe 提供有关如何解决此类问题的方法提示。

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 2017-11-29
    • 2018-04-16
    • 2019-09-01
    • 2018-09-06
    • 2015-06-27
    • 2021-02-14
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多