如何在 NodeJS 的请求中对表单字段中的数组进行编码?
How do I encode an array in a form field in NodeJS' request?
我使用的 API 需要我在表单字段中放置一个数组。给出的示例在 PHP 中,但我使用的是 NodeJS。 API 期望其中一个字段是一个数组,我很难弄清楚如何做到这一点。
PHP 示例如下所示:
$request->buildPostBody(array(
'reference' => array(
'line1' => 'Soundboard Setup',
'line2' => 'Thank you for the order',
'line3' => 'Our reference is: 3993029/11BD'
),
'lines' => array(
array('amount' => 50,
'amount_desc' => 'panels',
'description' => 'Sound buttons',
'tax_rate' => 21,
'price' => 5.952
),
array('amount' => 1,
'amount_desc' => '',
'description' => 'Wooden case',
'tax_rate' => 21,
'price' => 249
),
array('amount' => 10,
'amount_desc' => 'hours',
'description' => 'Support',
'tax_rate' => 6,
'price' => 62.5
),
array('description' => 'This is a textline'))
));
在 NodeJS 中,我试过这个(除其他外):
var formData = {
reference: [{'line1':'something'}], // <- this isn't going to fly
lines: [{
'amount': amount,
'amount_desc': 'amount_desc',
'description': 'description',
'tax_rate': 0,
'price': 100
}]
};
request.post({
url: 'https://www.factuursturen.nl/api/v1/invoices/',
formData: formData,
headers: {
'Authorization': 'Basic ' + new Buffer(user + ':' + key).toString('base64')
}
}, function (error, response, body) {
if (!error && [200, 201, 204].indexOf(response.statusCode) > 0) {
console.log('posted ': ', response.statusCode);
} else {
console.log('problem with request: ', error, response.statusCode, body);
}
}
);
当我尝试像这样传递对象时:reference: {'line1':'foo'}
我从 Node 收到错误:
node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js:33
source.on('error', function() {});
^
TypeError: Object #<Object> has no method 'on'
我怎样才能最好地把这个圆钉钉进那个方孔?
在PHP中数组可以是数组和它们可以是关联数组,它们本质上是 JavaScript.
中的对象
Specifying with array()
An array can be created using the array() language construct. It takes any number of comma-separated key => value pairs as arguments.
array(
key => value,
key2 => value2,
key3 => value3,
...
)
在JavaScript中,上面的内容本质上是只是一个对象
{
key: 'value',
key2: 'value2'
key3: 'value3'
...
}
它不会是包裹在数组 [{…}]
中的对象,这正是您对 reference
所做的
因此,要模仿 PHP 结构,您的数据应如下所示:
var formData = {
reference: {'line1':'something'}, // <- this should work now
lines: [{ // <- this is still an array of objects [{}], as in PHP too, it's a nested array
amount: amount,
'amount_desc': 'amount_desc',
'description': 'description',
'tax_rate': 0,
'price': 100
}]
};
但是正如您所注意到的,这会导致另一个问题。
When I try to pass an object like so: reference: {'line1':'foo'}
I get an error from Node:
node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js:33
source.on('error', function() {});
^
TypeError: Object #<Object> has no method 'on'
这里解释这个错误:https://github.com/request/request/issues/1495
基本上 form-data
只需要简单的对象,可能只有 1 层深。
试试这个:
var formData = {
'reference.line1': 'something',
'lines[0].amount': amount,
'lines[0].amount_desc': 'amount_desc',
'lines[0].description': 'description',
'lines[0].tax_rate': 0,
'lines[0].price': 100,
};
我使用的 API 需要我在表单字段中放置一个数组。给出的示例在 PHP 中,但我使用的是 NodeJS。 API 期望其中一个字段是一个数组,我很难弄清楚如何做到这一点。
PHP 示例如下所示:
$request->buildPostBody(array(
'reference' => array(
'line1' => 'Soundboard Setup',
'line2' => 'Thank you for the order',
'line3' => 'Our reference is: 3993029/11BD'
),
'lines' => array(
array('amount' => 50,
'amount_desc' => 'panels',
'description' => 'Sound buttons',
'tax_rate' => 21,
'price' => 5.952
),
array('amount' => 1,
'amount_desc' => '',
'description' => 'Wooden case',
'tax_rate' => 21,
'price' => 249
),
array('amount' => 10,
'amount_desc' => 'hours',
'description' => 'Support',
'tax_rate' => 6,
'price' => 62.5
),
array('description' => 'This is a textline'))
));
在 NodeJS 中,我试过这个(除其他外):
var formData = {
reference: [{'line1':'something'}], // <- this isn't going to fly
lines: [{
'amount': amount,
'amount_desc': 'amount_desc',
'description': 'description',
'tax_rate': 0,
'price': 100
}]
};
request.post({
url: 'https://www.factuursturen.nl/api/v1/invoices/',
formData: formData,
headers: {
'Authorization': 'Basic ' + new Buffer(user + ':' + key).toString('base64')
}
}, function (error, response, body) {
if (!error && [200, 201, 204].indexOf(response.statusCode) > 0) {
console.log('posted ': ', response.statusCode);
} else {
console.log('problem with request: ', error, response.statusCode, body);
}
}
);
当我尝试像这样传递对象时:reference: {'line1':'foo'}
我从 Node 收到错误:
node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js:33
source.on('error', function() {});
^
TypeError: Object #<Object> has no method 'on'
我怎样才能最好地把这个圆钉钉进那个方孔?
在PHP中数组可以是数组和它们可以是关联数组,它们本质上是 JavaScript.
中的对象Specifying with array()
An array can be created using the array() language construct. It takes any number of comma-separated key => value pairs as arguments.
array( key => value, key2 => value2, key3 => value3, ... )
在JavaScript中,上面的内容本质上是只是一个对象
{
key: 'value',
key2: 'value2'
key3: 'value3'
...
}
它不会是包裹在数组 [{…}]
中的对象,这正是您对 reference
因此,要模仿 PHP 结构,您的数据应如下所示:
var formData = {
reference: {'line1':'something'}, // <- this should work now
lines: [{ // <- this is still an array of objects [{}], as in PHP too, it's a nested array
amount: amount,
'amount_desc': 'amount_desc',
'description': 'description',
'tax_rate': 0,
'price': 100
}]
};
但是正如您所注意到的,这会导致另一个问题。
When I try to pass an object like so:
reference: {'line1':'foo'}
I get an error from Node:node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js:33 source.on('error', function() {}); ^ TypeError: Object #<Object> has no method 'on'
这里解释这个错误:https://github.com/request/request/issues/1495
基本上 form-data
只需要简单的对象,可能只有 1 层深。
试试这个:
var formData = {
'reference.line1': 'something',
'lines[0].amount': amount,
'lines[0].amount_desc': 'amount_desc',
'lines[0].description': 'description',
'lines[0].tax_rate': 0,
'lines[0].price': 100,
};