জেএসনকে এইচটিটিপি পোস্ট অনুরোধে পাস করুন


92

আমি নোডেজ এবং অনুরোধ [2] ব্যবহার করে গুগল কিউপিএক্স এক্সপ্রেস এপিআই [1] তে এইচটিটিপি পোস্ট করার অনুরোধ করছি ।

আমার কোডটি নিম্নরূপ দেখায়:

    // 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)
        }
    })

আমি যা করার চেষ্টা করছি তা হচ্ছে মাল্টিপার্ট আর্গুমেন্ট [3] ব্যবহার করে জেএসএন পাস করা। তবে সঠিক জেএসওএন প্রতিক্রিয়ার পরিবর্তে আমি একটি ত্রুটি পেয়েছি (৪০০ অপরিবর্তিত)।

আমি যখন পরিবর্তে সিআরএল ব্যবহার করে একই জেএসএন এবং এপিআই কী ব্যবহার করে একটি অনুরোধ করি তখন তা ঠিক কাজ করে। সুতরাং আমার এপিআই কী বা জেএসএন-তে কোনও সমস্যা নেই।

আমার কোডে কী ভুল?

সম্পাদনা :

কাজ করছেন সিআরএল উদাহরণ:

i) আমি 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) তারপরে, টার্মিনালে আমি সেই ডিরেক্টরিতে স্যুইচ করেছি যেখানে সদ্য নির্মিত অনুরোধ.জসন ফাইলটি উপস্থিত ছিল এবং চালিত হয়েছিল (myApiKey স্পষ্টতই আমার আসল এপিআই কী হিসাবে দাঁড়িয়েছে):

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

[1] https://developers.google.com/qpx-express/ [2] নোডেজগুলির জন্য ডিজাইন করা একটি HTTP অনুরোধ ক্লায়েন্ট: https://www.npmjs.org/package/request [3] আমি এখানে পাওয়া একটি উদাহরণ এখানে পেয়েছি https://www.npmjs.org/package/request#m Multipart-related [4] কিউপিএক্স এক্সপ্রেস এপিআই 400 পার্স ত্রুটি ফিরে আসছে


আপনার অনুরোধ থেকে 'json: সত্য' অপসারণের চেষ্টা করুন
বার্ট

কোন পার্থক্য নেই। তবে যতদূর আমি জানি এটি কেবলমাত্র উল্লেখ করে যে প্রতিক্রিয়াটি ঠিক একটি জসন?
রনিন

আপনি কি কাজ করতে পারেন সেই সিআরএল কমান্ড লাইনটি প্রদর্শন করতে পারেন?
mscdex

কৌতূহলের বাইরে আপনি কেন বহুগুণ ব্যবহার করছেন?
ক্লাউডফিট

@ এমএসসিডিএক্স দয়া করে আমার আপডেট হওয়া মূল পোস্টটি দেখুন
রনিন

উত্তর:


168

আমি মনে করি নিম্নলিখিতগুলির কাজ করা উচিত:

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

এই ক্ষেত্রে, Content-type: application/jsonশিরোনামটি স্বয়ংক্রিয়ভাবে যুক্ত হয়।


4
যে কারণেই হোক না কেন, আমি যে শেষ পয়েন্টটি হিট করছি তা প্রথম পদ্ধতিটি (যেমন তারা প্রেরণ করা হয়নি) ব্যবহার করে প্যারামগুলি পড়তে পারে নি তবে দ্বিতীয় পদ্ধতিতে এটি করতে সক্ষম হয়েছিল।
অজানা দেব

জামিল যা বলেছিল তেমনভাবে। আমি SyntaxError: Unexpected token &quot;<br> &nbsp; &nbsp;at parse (/home/malcolm/complice/node_modules/body-parser/lib/types/json.js:83:15)প্রথম পদ্ধতি দিয়েছিলাম।
ম্যালকোমোশন

@ ম্যালকমম ওশেন এর কারণ এটি যে কোনও অনলাইন ট্যাগ বৈধ জেএসওএন সামগ্রী নয়
টবি

আমি এই ত্রুটি পেয়েছি:, [ERR_STREAM_WRITE_AFTER_END]: write after endআমি কীভাবে এটি সংশোধন করতে পারি?
মেহেদী দেহঘানি

18

আমি এ নিয়ে দীর্ঘদিন ধরে কাজ করেছি। যে উত্তরটি আমাকে সহায়তা করেছিল তা ছিল: সামগ্রী-প্রকার: নোড.জেএস সহ অ্যাপ্লিকেশন / জসন পোস্ট প্রেরণ করুন

যা নিম্নলিখিত ফর্ম্যাটটি ব্যবহার করে:

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)। আপনার যা প্রয়োজন তা এখানে:

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. এটি একটি ত্রুটি Your jsfiddle.net/f71opd7p পূর্ণ প্রতিক্রিয়া দেখার জন্য দয়া করে
রনিন

4
অনুরোধ ডকুমেন্টেশন এবং কোড অনুযায়ী @ টোবি , json: trueউভয় JSON.stringify() body এবং JSON.parse() প্রতিক্রিয়া উচিত ।
mscdex

এই উত্তর। এর বাইরে আপনি প্রতিক্রিয়াটি পাইপ করতে পারেনrequest('xxx',{ json: true, body: req.body }).pipe(res).on('error', catchErr);
সিডোনাল্ডসন

গ্রহণযোগ্য উত্তর না থাকলে এটি আমার পক্ষে কাজ করেছিল।
গ্রেগ_ডিজেল

আমি এই ত্রুটি পেয়েছি:, [ERR_STREAM_WRITE_AFTER_END]: write after endআমি কীভাবে এটি সংশোধন করতে পারি?
মেহেদী দেহঘানি

9

এখন নতুন জাভাস্ক্রিপ্ট সংস্করণ (ECMAScript 6 http://es6-features.org/#ClassD Definition) এর সাথে নোডেজ এবং প্রতিশ্রুতি অনুরোধ ব্যবহার করে অনুরোধগুলি জমা দেওয়ার আরও ভাল উপায় রয়েছে ( http://www.wintellect.com/devcenter/nstieglitz/5 -es-গ্রেট-বৈশিষ্ট্যগুলি-এ-এস-সামঞ্জস্য )

লাইব্রেরি ব্যবহার করে: 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"শিরোনাম যোগ করে body অতিরিক্তভাবে, প্রতিক্রিয়া সংস্থাকে JSON হিসাবে পার্স করে। লিঙ্ক


2

ডক অনুসারে: 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

আপনি আনতে অনুরোধের বডি (তৃতীয় আর্গুমেন্ট) হিসাবে জেসন অবজেক্টটি পাস করতে পারেন।


4
এটি প্রশ্নের উত্তর দেয় না। আপনার যথেষ্ট খ্যাতি অর্জনের পরে আপনি কোনও পোস্টে মন্তব্য করতে সক্ষম হবেন ; পরিবর্তে, গাইড
আন্না
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.