JSON को HTTP POST अनुरोध पास करें


92

मैं Google QPX एक्सप्रेस API [1] को नोडज और अनुरोध [2] का उपयोग करके HTTP POST अनुरोध करने की कोशिश कर रहा हूं ।

मेरा कोड इस प्रकार दिखता है:

    // create http request client to consume the QPX API
    var request = require("request")

    // JSON to be passed to the QPX Express API
    var requestData = {
        "request": {
            "slice": [
                {
                    "origin": "ZRH",
                    "destination": "DUS",
                    "date": "2014-12-02"
                }
            ],
            "passengers": {
                "adultCount": 1,
                "infantInLapCount": 0,
                "infantInSeatCount": 0,
                "childCount": 0,
                "seniorCount": 0
            },
            "solutions": 2,
            "refundable": false
        }
    }

    // QPX REST API URL (I censored my api key)
    url = "https://www.googleapis.com/qpxExpress/v1/trips/search?key=myApiKey"

    // fire request
    request({
        url: url,
        json: true,
        multipart: {
            chunked: false,
            data: [
                {
                    'content-type': 'application/json',
                    body: requestData
                }
            ]
        }
    }, function (error, response, body) {
        if (!error && response.statusCode === 200) {
            console.log(body)
        }
        else {

            console.log("error: " + error)
            console.log("response.statusCode: " + response.statusCode)
            console.log("response.statusText: " + response.statusText)
        }
    })

मैं क्या करने की कोशिश कर रहा हूँ JSON मल्टीपार्ट तर्क का उपयोग कर रहा है [3]। लेकिन उचित JSON प्रतिक्रिया के बजाय मुझे एक त्रुटि मिली (400 अपरिभाषित)।

जब मैं CURL के बजाय उसी JSON और API कुंजी का उपयोग करके एक अनुरोध करता हूं, तो यह ठीक काम करता है। इसलिए मेरी API कुंजी या JSON में कुछ भी गलत नहीं है।

मेरे कोड में क्या गलत है?

संपादित करें :

काम CURL उदाहरण:

i) मैंने JSON को सहेजा है जिसे मैं "request.json" नामक फ़ाइल में अपने अनुरोध के लिए भेजूंगा:

{
  "request": {
    "slice": [
      {
        "origin": "ZRH",
        "destination": "DUS",
        "date": "2014-12-02"
      }
    ],
    "passengers": {
      "adultCount": 1,
      "infantInLapCount": 0,
      "infantInSeatCount": 0,
      "childCount": 0,
      "seniorCount": 0
    },
    "solutions": 20,
    "refundable": false
  }
}

ii) फिर, टर्मिनल में मैंने उस निर्देशिका पर स्विच किया जिसमें नव निर्मित request.json फ़ाइल स्थित थी और चला रही थी (myApiKey का अर्थ है मेरी वास्तविक एपीआई कुंजी स्पष्ट रूप से)

curl -d @request.json --header "Content-Type: application/json" https://www.googleapis.com/qpxExpress/v1/trips/search?key=myApiKey

[१] https://developers.google.com/qpx-express/ [२] एक http अनुरोध क्लाइंट जो नोडज के लिए डिज़ाइन किया गया है: https://www.npmjs.org/package/request [३] यहाँ एक उदाहरण है जो मुझे मिला https://www.npmjs.org/package/request#multipart-related [4] QPX एक्सप्रेस API 400 पार्स त्रुटि लौटा रहा है


आपके अनुरोध से 'json: true' को हटाने का प्रयास करें
Baart

कोई फर्क नहीं पड़ता। लेकिन जहां तक ​​मुझे पता है यह केवल यह निर्दिष्ट करता है कि प्रतिक्रिया एक अधिकार है?
रॉनिन

क्या आप cURL कमांड लाइन दिखा सकते हैं जो काम करती है?
mscdex

जिज्ञासा से बाहर, आप मल्टीपार्ट का उपयोग क्यों कर रहे हैं?
क्लाउड

@mscdex कृपया मेरी अद्यतन मूल पोस्ट देखें
Ronin

जवाबों:


168

मुझे लगता है कि निम्नलिखित काम करना चाहिए:

// fire request
request({
    url: url,
    method: "POST",
    json: requestData
}, ...

इस स्थिति में, Content-type: application/jsonशीर्ष लेख स्वचालित रूप से जोड़ा जाता है।


1
जो भी कारण के लिए, मैं जो समापन बिंदु मार रहा था, वह पहली विधि का उपयोग करते हुए पैरामेट्स को नहीं पढ़ सकता था (जैसे कि उन्हें नहीं भेजा गया था) लेकिन दूसरी विधि के साथ ऐसा करने में सक्षम था।
अज्ञात देव

इसी तरह जमील ने क्या कहा। मैं SyntaxError: Unexpected token &quot;<br> &nbsp; &nbsp;at parse (/home/malcolm/complice/node_modules/body-parser/lib/types/json.js:83:15)पहली विधि के साथ मिला ।
मैल्कमऑन सीज़न

@MalcolmOcean ऐसा इसलिए है क्योंकि एक <br> टैग वैध JSON सामग्री नहीं है
टोबी

मुझे यह त्रुटि मिली: [ERR_STREAM_WRITE_AFTER_END]: write after endमैं इसे कैसे ठीक कर सकता हूं?
मेहदी देहनागी

18

मैंने इस पर बहुत लंबे समय तक काम किया। इसका उत्तर जिसने मेरी मदद की: Content-Type: application / json post with node.js भेजें

जो निम्न प्रारूप का उपयोग करता है:

request({
    url: url,
    method: "POST",
    headers: {
        "content-type": "application/json",
        },
    json: requestData
//  body: JSON.stringify(requestData)
    }, function (error, resp, body) { ...

10

आप मल्टीपार्ट नहीं चाहते हैं, लेकिन Content-Type: application/jsonइसके बजाय "सादा" POST अनुरोध (साथ )। यहाँ आप की जरूरत है:

var request = require('request');

var requestData = {
  request: {
    slice: [
      {
        origin: "ZRH",
        destination: "DUS",
        date: "2014-12-02"
      }
    ],
    passengers: {
      adultCount: 1,
      infantInLapCount: 0,
      infantInSeatCount: 0,
      childCount: 0,
      seniorCount: 0
    },
    solutions: 2,
    refundable: false
  }
};

request('https://www.googleapis.com/qpxExpress/v1/trips/search?key=myApiKey',
        { json: true, body: requestData },
        function(err, res, body) {
  // `body` is a js object if request was successful
});

मैंने यह कोशिश की, लेकिन एक और त्रुटि मिली: "400। यह एक त्रुटि है। आपके ग्राहक ने एक विकृत या अवैध अनुरोध जारी किया है। यह सभी जानते हैं।" पूरी प्रतिक्रिया के लिए कृपया jsfiddle.net/f71opd7p कृपया
Ronin

4
@ अनुरोध अनुरोध दस्तावेज़ और कोड के अनुसार , json: trueदोनों JSON.stringify() body और JSON.parse() प्रतिक्रिया चाहिए ।
mscdex

यह जवाब है। इसके आगे आप प्रतिक्रिया को पाइप भी कर सकते हैंrequest('xxx',{ json: true, body: req.body }).pipe(res).on('error', catchErr);
साइडोल्सेसन

मेरे लिए यह तब काम किया जब स्वीकृत उत्तर नहीं था।
greg_diesel

मुझे यह त्रुटि मिली: [ERR_STREAM_WRITE_AFTER_END]: write after endमैं इसे कैसे ठीक कर सकता हूं?
मेहदी देघानी

9

अब नए जावास्क्रिप्ट संस्करण (ECMAScript 6 http://es6-features.org/#ClassDefinition ) के साथ नोडज और प्रॉमिस अनुरोध ( http://www.wintellect.com/devcenter/nieieglitz/5) का उपयोग करके अनुरोध सबमिट करने का एक बेहतर तरीका है । -गेट-फीचर-इन-एस -6-सद्भाव )

पुस्तकालय का उपयोग करना: https://github.com/request/request-promise

npm install --save request
npm install --save request-promise

ग्राहक:

//Sequential execution for node.js using ES6 ECMAScript
var rp = require('request-promise');

rp({
    method: 'POST',
    uri: 'http://localhost:3000/',
    body: {
        val1 : 1,
        val2 : 2
    },
    json: true // Automatically stringifies the body to JSON
}).then(function (parsedBody) {
        console.log(parsedBody);
        // POST succeeded...
    })
    .catch(function (err) {
        console.log(parsedBody);
        // POST failed...
    });

सर्वर:

var express = require('express')
    , bodyParser = require('body-parser');

var app = express();

app.use(bodyParser.json());

app.post('/', function(request, response){
    console.log(request.body);      // your JSON

    var jsonRequest = request.body;
    var jsonResponse = {};

    jsonResponse.result = jsonRequest.val1 + jsonRequest.val2;

    response.send(jsonResponse);
});


app.listen(3000);

3

उदाहरण।

var request = require('request');

var url = "http://localhost:3000";

var requestData = {
    ...
} 

var data = {
    url: url,
    json: true,
    body: JSON.stringify(requestData)
}

request.post(data, function(error, httpResponse, body){
    console.log(body);
});

json: trueविकल्प के रूप में , मान के JSON प्रतिनिधित्व के लिए शरीर सेट करता है और "Content-type": "application/json"हेडर जोड़ता है । इसके अतिरिक्त, JSON के रूप में प्रतिक्रिया निकाय को पार्स करता है। संपर्क


2

Doc के अनुसार: https://github.com/request/request

उदाहरण है:

  multipart: {
      chunked: false,
      data: [
        {
          'content-type': 'application/json', 
          body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})
        },
      ]
    }

मुझे लगता है कि आप एक ऑब्जेक्ट भेजते हैं जहां एक स्ट्रिंग की उम्मीद है, प्रतिस्थापित करें

body: requestData

द्वारा

body: JSON.stringify(requestData)

2
       var request = require('request');
        request({
            url: "http://localhost:8001/xyz",
            json: true,
            headers: {
                "content-type": "application/json",
            },
            body: JSON.stringify(requestData)
        }, function(error, response, body) {
            console.log(response);
        });

0

मुझे लगता है

var x = request.post({
       uri: config.uri,
       json: reqData
    });

इस तरह परिभाषित करना आपके कोड को लिखने का प्रभावी तरीका होगा। और एप्लिकेशन / जसन को स्वचालित रूप से जोड़ा जाना चाहिए। इसे विशेष रूप से घोषित करने की कोई आवश्यकता नहीं है।


0

आप भ्रूण अनुरोध के मुख्य भाग (तीसरे तर्क) के रूप में json ऑब्जेक्ट को पास कर सकते हैं।


1
यह प्रश्न का उत्तर प्रदान नहीं करता है। एक बार आपके पास पर्याप्त प्रतिष्ठा होने पर आप किसी भी पोस्ट पर टिप्पणी कर पाएंगे ; इसके बजाय, गाइड के
अन्ना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.