【问题标题】:How to write curl 'PUT' request in node with 'request' module如何使用'request'模块在节点中编写curl'PUT'请求
【发布时间】:2017-06-10 04:06:29
【问题描述】:

我有这个 curl 请求工作。

curl -v "https://developer.api.autodesk.com/oss/v2/buckets/:bucketName/objects/" 
-X "PUT" -H "Authorization: Bearer tokenGoesHere" 
-H "Content-Type: application/octet-stream" -T "forupload.rvt"

如何使用 npm 请求模块在节点中编写此内容。 我用'request'和'fs'尝试了以下内容。 我返回“请求中未提供令牌”。

    function uploadFile(bucketData){
        var uri = 'https://developer.api.autodesk.com/oss/v2/buckets/' + bucketData['bucketKey'] + '/objects/'
        var authorizationHeader = ' Bearer ' + bucketData['token'] // this works in other post/get requests
        var contentTypeHeader = 'application/octet-stream'
        var streamTarget = 'C:\\Users\\architech\\Desktop\\Forge Node\\Test.rvt';
        console.log(uri)
        console.log(authorizationHeader)
        console.log(contentTypeHeader)
        console.log(streamTarget)
// console output:
// https://developer.api.autodesk.com/oss/v2/buckets/bucketpqglrzt/objects/
// Bearer ....token....
// application/octet-stream
// C:\Users\architech\Desktop\Forge Node\Test.rvt

        request.put(
            {
                url: uri,
       //       preambleCRLF: true,
       //       postambleCRLF: true,    
                multipart: 
                [
                    {
                        'Authorization': authorizationHeader,
                        'Content-Type': contentTypeHeader,                   
                         body: fs.createReadStream(streamTarget)
                    },  
                ]         
            },

            function(error, response, body){ 
                if(!error){
                    console.log(body);
                }else{
                    console.log(error);
                }
            })
    }

【问题讨论】:

  • 尝试以下类似的选项:{ uri: ..., headers: { 'Authorization': authorizationHeader, 'Content-Type': contentTypeHeader }, body: ... }
  • 您遇到任何具体错误?
  • @Mukesh Sharma 错误是“请求中未提供令牌。谢谢
  • @Ezra Chang 我试过了,我得到'对象丢失'。谢谢

标签: node.js curl autodesk-forge autodesk-model-derivative


【解决方案1】:

在尝试了几种方法后,虽然我无法重现您的具体问题,但我遇到的问题是正确加载二进制附件。因为createReadStream() 是异步运行的,所以当添加到multipartformData 键时,它似乎并没有像请求文档所说的那样工作。不知道这是为什么?

我首先使用http://requestb.in 让它工作 - 将 curl 请求与使用 Node.js 构造的相同请求进行比较。这是最终的工作版本:

var request = require('request')
fs = require('fs')

var options = {
    uri: 'https://developer.api.autodesk.com/oss/v2/buckets/<yourBucket>/objects/<yourFile.ext>',
    headers: {
        'Content-Type': 'application/octet-stream',
        'Authorization': 'Bearer <token>'
    }
}

fs.createReadStream(__dirname + '/<fileName.ext>').pipe(request.put(options, function(err, response, body) {
    console.log(body)
    /*
        {
          "bucketKey" : "< yourBucket>",
          "objectId" : "urn:adsk.objects:os.object:brandontestbucket2/skyscpr1.3ds",
          "objectKey" : "<fileName.ext>",
          "sha1" : "...redacted...",
          "size" : 43791,
          "contentType" : "application/octet-stream",
          "location" : "https://developer.api.autodesk.com/oss/v2/buckets/< yourBucket>/objects/<fileName.ext>"
        }
    */
}))

【讨论】:

  • 我的 uri 末尾有一个错误,我没有为上传的文件命名。进行了更正后,我已经尝试了您的两种方法,并且我得到了“不允许的多部分内容”。另外如何将我的请求打印到控制台?感谢您的回复。
  • 我建议尝试 requestb.in:将您的 Node 请求和 Curl 请求发送到 bin,然后比较请求。也就是说,如果 API 以“不允许多部分”响应,那么我建议查看他们的文档以找出发出请求的正确方法是什么。
  • 我决定使用 child_process 从命令行运行 curl 请求并捕获标准输出。我会在必要时重新审视这个。也许 api 不喜欢读取流如何提供文件...我会接受这个答案,因为它似乎是对发布的 curl 请求的准确翻译,但是 createReadStream 可能无法很好地与这个 autodesk api 配合使用。谢谢。
  • 我不会推荐这种解决方案,但如果你必须这样做,那就做你该做的。子进程面临的挑战是您失去了在 Node 生态系统中以编程方式管理请求和响应的能力,并且您依赖外部 Curl 按预期工作。
  • 另外,为了它的价值,我尝试在他们的文档中找到 /oss 端点,但找不到。如果你能告诉我它在文档中的位置,我可以继续尝试。
猜你喜欢
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 2015-05-14
  • 2014-07-07
  • 2019-11-16
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多