2017-02-24 6 views
1

次のJavascriptオブジェクトをあるローカルのnodejs(express)インスタンスから別のインスタンスに送信しようとしています。投稿リクエスト中にJSON文字列が変更されました

var v = { 
    items: [{ 
     id: "fil1", 
     values: [ 
      { key: "123", timestamp: 333, value: "aaa" }, 
      { key: "123", timestamp: 333, value: "aaa" }, 
      { key: "123", timestamp: 333, value: "aaa" }, 
      { key: "123", timestamp: 333, value: "aaa" } 
     ] 
    }] 
}; 

Iは、次のPOSTリクエストrequest = require('request')を使用し、paramsは、上記目的vのJSON.stringifiedバージョンです。

var performPostRequest = function (ip, port, endpoint, params, callback) { 
var url = "http://" + ip + ":" + port + "/" + endpoint; 
request.post({ 
    url: url, 
    form: params, 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json' 
    } 
}, function (err, response, body) { 
    if (err) { 
     callback(err, body); 
    } 
    if (body) { 
     callback(err, JSON.parse(body)); 
    } 
}); 
}; 

受信エンドポイントは、次のようになります。ルータがexpress.Router(ある

router.post('/values', function (req, res) { 

    console.log(req.body); 

    res.status(201).send(""); 
}); 

)。

JSON.stringify(v)を送信者に印刷すると、結果はオブジェクトvと一致する文字列になりますが、受信側のエンドポイントで要求の本文を印刷すると、文字列が台無しになります(下記参照) 。私は間違って何をしていますか?送信者の

JSON.stringify(v):受信機で

{"items":[{"id":"fil1","values":[{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"}]}]} 

req.body

{ '{"items":': { '{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"}': '' } } 
+0

'params'は文字列ですか? [request docs](https://www.npmjs.com/package/request#requestoptions-callback)は、 'form'オプションの値がJSON文字列ではなく、オブジェクトまたはクエリ文字列でなければならないことを示しています。 'body'を使うことを意味しましたか? –

答えて

1

あなたはrequest docからすべての世話をjsonオプションを使用してrequestを使用してJSONを送ることができます。

json - bodyを値のJSON表現に設定し、 Content-type:application/jsonヘッダーを追加します。さらに、 レスポンスボディをJSONとして解析します。

var request = require('request'); 

var options = { 
    url: url, 
    method: 'POST', 
    json: { 
     items: [{ 
      id: "fil1", 
      values: [ 
       { key: "123", timestamp: 333, value: "aaa" }, 
       { key: "123", timestamp: 333, value: "aaa" }, 
       { key: "123", timestamp: 333, value: "aaa" }, 
       { key: "123", timestamp: 333, value: "aaa" } 
      ] 
     }] 
    }; 
}; 

request(options, function(error, response, body) { 
    if (error) { 
     callback(err, body); 
    } 
    if (body) { 
     callback(error, body); 
    } 
}); 
+0

ありがとうBertrand、私は試みます。 jsonでは "form"オプションを使用しないでください。 – GINGERT

+0

同じ[readme](https://github.com/request/request)から: 'form - オブジェクトまたはクエリ文字列が渡されたとき、bodyをvalueのクエリーストリング表現に設定し、Content-type:application/x-www-form-urlencodedヘッダー。オプションを渡さなかった場合、FormDataインスタンスが返されます(そして要求にパイプされます)。そうではありません.Jsonデータには使用しないでください。 –

関連する問題