10

我正在尝试从我使用请求formData获得的图像中发送一个流

问题是请求在请求之后被触发formData。有什么办法可以通过管道识别图像请求吗?但是可以自由地向formData?

例如:

var req = request({
  method: 'POST',
  url: 'http://www.foo.bar/api/v1/tag/recognize',
  formData: {
    image_file: request('http://visual-recognition-demo.mybluemix.net/images/horses.jpg'),
    param2: 'value2'
  },
  json: true,
});

如何开火:

request('http://visual-recognition-demo.mybluemix.net/images/horses.jpg') 所以响应可以用于req

更新:似乎http://visual-recognition-demo.mybluemix.net/images/horses.jpg响应Content-Length中缺少标题 ,您只会得到

Transfer-Encoding: chunked

更多细节在这里

4

1 回答 1

8

看看这部分文档。你所描述的本质上就是这个块

request.get('http://google.com/img.png').pipe(request.put('some_url'));  

注意文档

这样做时,内容类型和内容长度将保留在 PUT 标头中。

另请注意,如果您不指定回调,请求将始终返回 Stream。如果您确实提供了回调,它会尝试将响应转换为字符串。使用encoding:null它来返回原始字节。
例子 -

request({
   url: 'some_url', //your image
   encoding: null  //returns resp.body as bytes
}, callback..)

要将调用链接在一起(一个接一个地运行),您可以嵌套回调或使用承诺。例如在另一个请求完成后运行一个请求 -

var request = require('request');

//1st
request('first_url', function (error, response, body) {
  if (!error && response.statusCode == 200) {

      //2nd
      request('other_url', function (error, response, body) {   
         //process resp
      });
  }
});  

或者更好的是,将请求回调代码转换为 Promises。 有关如何执行此操作 的信息,请参阅 Bluebird 之类的 promise 库。

这是 bluebird 的一个示例(使用 then 以迭代方式工作)

var Promise = require("bluebird");
Promise.promisifyAll(require("request"));

request.getAsync('some_url').then(function(resp) {
   request.getAsync('some_other_url').then(..processing code..);
});
于 2015-03-31T18:31:30.240 回答