1

フォーム フィールドに配列を配置する必要がある API を使用しています。与えられた例は PHP ですが、私は NodeJS を使用しています。API は、フィールドの 1 つが配列であることを想定していますが、これを行う方法を理解するのに苦労しています。

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_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'

この丸いペグをその四角い穴に押し込むにはどうすればよいでしょうか?

4

1 に答える 1

2

PHP では、配列は配列にすることも、連想配列することもできます。これらは基本的に JavaScript のオブジェクトです。

array()で指定する

配列は、array() 言語構造を使用して作成できます。コンマで区切られたキー => 値のペアを引数として任意の数取ります。

array(
    key  => value,
    key2 => value2,
    key3 => value3,
    ...
)

JavaScript では、上記は基本的に単なるオブジェクトになります

{
    key: 'value',
    key2: 'value2'
    key3: 'value3'
    ...
}

array 内にラップされたオブジェクトにはなりません[{…}]。これは、あなたがあなたの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
  }]
};

しかし、あなたが気づいたように、それは別の問題を引き起こします。


次のようにオブジェクトを渡そうとするとreference: {'line1':'foo'}、ノードからエラーが発生します。

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,
};
于 2015-06-14T17:46:27.047 に答える