নোড.জেএস এক্সপ্রেসে HTTP জিইটি অনুরোধ Requ


191

আমি নোড.জেএস বা এক্সপ্রেস.জেএস এর মধ্যে কীভাবে এইচটিটিপি অনুরোধ করব? আমার অন্য একটি পরিষেবাতে সংযোগ করা দরকার। আমি আশা করছি কলটি অবিচ্ছিন্ন এবং কলব্যাকটিতে দূরবর্তী সার্ভারের প্রতিক্রিয়া রয়েছে।

উত্তর:


219

আমার একটি নমুনা থেকে কিছু কোডের স্নিপেট এখানে। এটি অ্যাসিঙ্ক্রোনাস এবং একটি JSON অবজেক্ট প্রদান করে। এটি জিইটি অনুরোধের যে কোনও ফর্ম করতে পারে।

মনে রাখবেন আরও সর্বোত্তম উপায় রয়েছে (কেবলমাত্র একটি নমুনা) - উদাহরণস্বরূপ, আপনি কোনও অ্যারে রেখেছিলেন সেই অংশগুলিকে বোঝানোর পরিবর্তে এবং এতে যোগ দিন ... আশা করি, এটি আপনাকে সঠিক দিকে শুরু করবে:

const http = require('http');
const https = require('https');

/**
 * getJSON:  RESTful GET request returning JSON object(s)
 * @param options: http options object
 * @param callback: callback to pass the results JSON object(s) back
 */

module.exports.getJSON = (options, onResult) => {
  console.log('rest::getJSON');
  const port = options.port == 443 ? https : http;

  let output = '';

  const req = port.request(options, (res) => {
    console.log(`${options.host} : ${res.statusCode}`);
    res.setEncoding('utf8');

    res.on('data', (chunk) => {
      output += chunk;
    });

    res.on('end', () => {
      let obj = JSON.parse(output);

      onResult(res.statusCode, obj);
    });
  });

  req.on('error', (err) => {
    // res.send('error: ' + err.message);
  });

  req.end();
};

এটিকে একটি বিকল্প বিকল্প তৈরি করে বলা হয়:

const options = {
  host: 'somesite.com',
  port: 443,
  path: '/some/path',
  method: 'GET',
  headers: {
    'Content-Type': 'application/json'
  }
};

এবং একটি কলব্যাক ফাংশন প্রদান।

উদাহরণস্বরূপ, একটি পরিষেবাদিতে আমার উপরে ওপেনস্টিক মডিউল প্রয়োজন এবং তারপরে এটি করুন:

rest.getJSON(options, (statusCode, result) => {
  // I could work with the resulting HTML/JSON here. I could also just return it
  console.log(`onResult: (${statusCode})\n\n${JSON.stringify(result)}`);

  res.statusCode = statusCode;

  res.send(result);
});

হালনাগাদ

আপনি যদি async/ await(লিনিয়ার, কোনও কলব্যাক) খুঁজছেন না, প্রতিশ্রুতি দিবেন, সময় সমর্থন এবং ইন্টিলিজেন্স সংকলন করুন, আমরা একটি হালকা এইচটিটিপি এবং আরএসইএস ক্লায়েন্ট তৈরি করেছি যা সেই বিলটির সাথে খাপ খায়:

মাইক্রোসফ্ট টাইপড-রেস্ট ক্লায়েন্ট


@ ব্রায়ানম্যাক আপনি দয়া করে সম্পূর্ণ নমুনা পাঠাতে / যুক্ত করতে পারবেন?
StErMi

@ ব্রায়ানম্যাক আপনার অনুমতি নিয়ে আমি বর্তমানে কোডটি তৈরি করছি এই কোড গ্রান্ট প্লাগইনটি ব্যবহার করতে চাই। নিশ্চিত না যে এটি কখন শেষ হবে যখন এটি সম্পূর্ণ উন্মুক্ত হয়ে যাবে।
জেফএইচ

3
.. অনুরোধ মডিউল চেষ্টা এটা অনেক সহজ sitepoint.com/making-http-requests-in-node-js
saurshaz

6
হ্যাঁ - অনুরোধ মডিউলটি সহজ তবে অনুরোধ মডিউলের মতো লাইব্রেরিগুলি কী করছে তা দেখাচ্ছে এটি নিম্ন স্তর। আপনার যদি নিম্ন স্তরের নিয়ন্ত্রণ বা HTTP অনুরোধগুলির প্রয়োজন হয় (বড় ডাউনলোডগুলি ইত্যাদিতে অগ্রগতি দেখানো হচ্ছে ...), এটি কীভাবে এটি ঘটে তা দেখায়।
ব্রায়ানম্যাক

1
@ ক্রিসএইচএনএ - নোডে একটি কোয়েরিস্ট্রিং অবজেক্ট রয়েছে: নোডেজ.এস.পি / আইপি / ক্যুরিস্টিং এইচটিটিএমএল এবং ইউআরএল অবজেক্ট নোডেজএস.আর.ডোকস
স্লেস্ট /

100

Node.js এ সাধারণ http.get(options, callback)ফাংশনটি ব্যবহার করে দেখুন :

var http = require('http');
var options = {
  host: 'www.google.com',
  path: '/index.html'
};

var req = http.get(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  // Buffer the body entirely for processing as a whole.
  var bodyChunks = [];
  res.on('data', function(chunk) {
    // You can process streamed parts here...
    bodyChunks.push(chunk);
  }).on('end', function() {
    var body = Buffer.concat(bodyChunks);
    console.log('BODY: ' + body);
    // ...and/or process the entire body here.
  })
});

req.on('error', function(e) {
  console.log('ERROR: ' + e.message);
});

একটি সাধারণ http.request(options, callback)ফাংশন রয়েছে যা আপনাকে অনুরোধের পদ্ধতি এবং অন্যান্য অনুরোধের বিশদটি নির্দিষ্ট করতে দেয়।


ওপি যে সার্ভারের প্রতিক্রিয়া চেয়েছিল তার লিখিত সামগ্রীটি কোথায়?
ড্যান ড্যাসক্লেস্কু

আপডেটের জন্য ধন্যবাদ. দেখে মনে হচ্ছে তৎকালীন অংশগুলিকে একত্রিত করার জন্য কোনও 'শেষ' হ্যান্ডলারের প্রয়োজন। মূলত @ ব্রায়ানম্যাকের উত্তরের সমান?
ড্যান ড্যাসক্লেস্কু

@ ড্যানডাসকলেস্কু: হ্যাঁ, আপনি যদি পুরো শরীরটি (যা সম্ভবত) প্রক্রিয়া করতে চান তবে আপনি সম্ভবত এটি বাফার করতে চান এবং 'শেষ' প্রক্রিয়া করতে পারেন। আমি আমার উত্তরটিও সম্পূর্ণতার জন্য আপডেট করব।
maerics

দুঃখিত, আমি কী পরামিতিগুলির সাথে কলব্যাক কল করা হচ্ছে তা বুঝতে পারি না ... আমি কীভাবে শরীর পেতে পারি এবং সেই পরামিতিগুলির পরামিতিগুলির এবং বৈশিষ্ট্যের জন্য কোথায় রেফারেন্স হয়।
মুহাম্মদ উমর

@ মায়ারিকস GETআমার এই ইউআরএল থাকলে আমি কীভাবে এই অনুরোধটি ব্যবহার করতে পারি ? graph.facebook.com/debug_token? input_token={token-to-inspect} &access_token={app-token-or-admin-token}?
স্প্যানিশ 17

70

অনুরোধ এবং সুপারভাইজেন্টগুলি ব্যবহার করার জন্য বেশ ভাল গ্রন্থাগার।

দ্রষ্টব্য: অনুরোধ হ্রাস করা হয়েছে , আপনার ঝুঁকিতে ব্যবহার করুন!

ব্যবহার request:

var request=require('request');

request.get('https://someplace',options,function(err,res,body){
  if(err) //TODO: handle err
  if(res.statusCode === 200 ) //etc
  //TODO Do something with response
});

7
এটি কি res.statusCode === 200 যদি দ্বিতীয় হয়? )
গ্লেব ডলজিকভ

1
বিকল্পগুলি পরিবর্তনশীল কি? শুধু অপরিবর্তিত একটি পাস? আমি সন্দেহ করি
lxknvlk

32

আপনি অনুরোধও ব্যবহার করতে পারেন , একটি সত্যিই শীতল ও খুব সহজ HTTP- র ক্লায়েন্ট আমি nodeJS লিখেছেন + + এটা ক্যাশে সমর্থন করে।

জিইটি পদ্ধতি অনুরোধের জন্য কেবল নিম্নলিখিতটি করুন:

var requestify = require('requestify');

requestify.get('http://example.com/api/resource')
  .then(function(response) {
      // Get the response body (JSON parsed or jQuery object for XMLs)
      response.getBody();
  }
);

1
"এই অন্য সরঞ্জামটি ব্যবহার করে দেখুন" যদি বিদ্যমান টুলসেটটি পর্যাপ্ত থাকে তবে তা গ্রহণযোগ্য প্রতিক্রিয়া নয়।
গ্রুনিয়ন শাফটো

9

এই সংস্করণটি প্রাথমিকভাবে ব্রায়ানম্যাক ফাংশন দ্বারা প্রস্তাবিত যা প্রতিশ্রুতি, আরও ভাল ত্রুটি পরিচালনা এবং ES6 এ আবার লেখা হয় এর উপর ভিত্তি করে ।

let http = require("http"),
    https = require("https");

/**
 * getJSON:  REST get request returning JSON object(s)
 * @param options: http options object
 */
exports.getJSON = function(options)
{
    console.log('rest::getJSON');
    let reqHandler = +options.port === 443 ? https : http;

    return new Promise((resolve, reject) => {
        let req = reqHandler.request(options, (res) =>
        {
            let output = '';
            console.log('rest::', options.host + ':' + res.statusCode);
            res.setEncoding('utf8');

            res.on('data', function (chunk) {
                output += chunk;
            });

            res.on('end', () => {
                try {
                    let obj = JSON.parse(output);
                    // console.log('rest::', obj);
                    resolve({
                        statusCode: res.statusCode,
                        data: obj
                    });
                }
                catch(err) {
                    console.error('rest::end', err);
                    reject(err);
                }
            });
        });

        req.on('error', (err) => {
            console.error('rest::request', err);
            reject(err);
        });

        req.end();
    });
};

ফলস্বরূপ আপনাকে কলব্যাক ফাংশনে পাস করতে হবে না, পরিবর্তে জেএসএসন () প্রতিশ্রুতি দেয়। নিম্নলিখিত উদাহরণে একটি এক্সপ্রেসজেএস রুট হ্যান্ডলারের ভিতরে ফাংশনটি ব্যবহৃত হয়

router.get('/:id', (req, res, next) => {
    rest.getJSON({
        host: host,
        path: `/posts/${req.params.id}`,
        method: 'GET'
    }).then(({status, data}) => {
        res.json(data);
    }, (error) => {
        next(error);
    });
});

ত্রুটিতে এটি সার্ভার ত্রুটি মিডলওয়্যার পরিচালনা করার ক্ষেত্রে ত্রুটিটি প্রতিনিধিত্ব করে।


1
হ্যাঁ, এই উদাহরণটি দেখায় যে কীভাবে এটি এক্সপ্রেস getরুটের সংজ্ঞায়নের মধ্যে করা যায়, এখানে অনেক পোস্টের অভাব রয়েছে।
মাইক্রো

7

নোড থেকে এইচটিটিপি অনুরোধ করার জন্য ইউনিরেস্ট হ'ল সেরা গ্রন্থাগার। এটি একটি মাল্টিপ্লাটফর্ম ফ্রেমওয়ার্ক হিসাবে লক্ষ্য করা হচ্ছে, সুতরাং নোডে এটি কীভাবে কাজ করে তা শিখতে আপনাকে রুবাই, পিএইচপি, জাভা, পাইথন, অবজেক্টিভ সি,। নেট বা উইন্ডোজ 8 এ যদি কোনও HTTP ক্লায়েন্ট ব্যবহার করতে হয় তবে এটি আপনাকে ভালভাবে কাজ করবে। যতদূর আমি বলতে পারি নিরবিচ্ছিন্ন লাইব্রেরিগুলি বেশিরভাগ বিদ্যমান এইচটিটিপি ক্লায়েন্টদের দ্বারা সমর্থিত (যেমন জাভা, অ্যাপাচি এইচটিটিপি ক্লায়েন্ট, নোডে , মাইকের অনুরোধ লিবারি ) - ইউনাইরেস্ট কেবল একটি ভাল এপিআই রেখে দেয়।

নোড.জেএস এর জন্য কয়েকটি কোড উদাহরণ এখানে দেওয়া হয়েছে:

var unirest = require('unirest')

// GET a resource
unirest.get('http://httpbin.org/get')
  .query({'foo': 'bar'})
  .query({'stack': 'overflow'})
  .end(function(res) {
    if (res.error) {
      console.log('GET error', res.error)
    } else {
      console.log('GET response', res.body)
    }
  })

// POST a form with an attached file
unirest.post('http://httpbin.org/post')
  .field('foo', 'bar')
  .field('stack', 'overflow')
  .attach('myfile', 'examples.js')
  .end(function(res) {
    if (res.error) {
      console.log('POST error', res.error)
    } else {
      console.log('POST response', res.body)
    }
  })

আপনি নোড ডক্সে সোজা তিড়িং লাফ পারেন এখানে


3

পরীক্ষা করে দেখুন ছিন্নাংশ । এটি একটি নোড এইচটিটিপি ক্লায়েন্ট যা স্পায়ার.ইও তৈরি এবং রক্ষণাবেক্ষণ করে যা পুনঃনির্দেশগুলি, সেশনগুলি এবং জেএসওএন প্রতিক্রিয়াগুলি পরিচালনা করে। বিশ্রামের API গুলির সাথে ইন্টারঅ্যাক্ট করার জন্য এটি দুর্দান্ত। দেখুন এই ব্লগ পোস্টে আরো বিস্তারিত জানার জন্য।


3

পরীক্ষা করে দেখুন httpreq : এটা HTTP গেট বা পোস্ট মডিউল সেখানে নির্মিত কারণ আমি হতাশ ছিল কোন সহজ ছিল একটি নোড গ্রন্থাগার আমি এর ;-)


0

আপনার যদি কেবল সহজ পেতে অনুরোধ করতে হয় এবং অন্য কোনও এইচটিটিপি পদ্ধতিগুলির জন্য সমর্থন না প্রয়োজন তবে একবার দেখুন: সিম্পল-গেট :

var get = require('simple-get');

get('http://example.com', function (err, res) {
  if (err) throw err;
  console.log(res.statusCode); // 200
  res.pipe(process.stdout); // `res` is a stream
});

0

রিক্লিয়েন্ট ব্যবহার করুন : স্ক্রিপ্টিং উদ্দেশ্যে requestবা অন্য অনেক লাইব্রেরির জন্য নকশাকৃত নয় । যখন আপনাকে একই কনফিগারেশনটি পুনরায় পুনরায় ব্যবহার করতে হয় প্রয়োজন তখন কনস্ট্রাক্টর অনেক কনফিগারেশন নির্দিষ্ট করে দেয়: বেস ইউআরএল, শিরোনাম, লেখক বিকল্পগুলি, লগিং বিকল্পগুলি, ক্যাশিং ইত্যাদি। এছাড়াও দরকারী বৈশিষ্ট্য যেমন ক্যোরি এবং ইউআরএল পার্সিং, স্বয়ংক্রিয় ক্যোয়ারী এনকোডিং এবং জেএসএন পার্সিং ইত্যাদি

লাইব্রেরিটি ব্যবহারের সর্বোত্তম উপায় হ'ল এপিআইকে নির্দেশ করে অবজেক্টটি রফতানি করার জন্য একটি মডিউল তৈরি করা এবং এর সাথে সংযোগের জন্য প্রয়োজনীয় কনফিগারেশন:

মডিউল client.js:

let RequestClient = require("reqclient").RequestClient

let client = new RequestClient({
  baseUrl: "https://myapp.com/api/v1",
  cache: true,
  auth: {user: "admin", pass: "secret"}
})

module.exports = client

এবং যে কন্ট্রোলারে আপনার এপিআই ব্যবহারটি গ্রাস করতে হবে:

let client = require('client')
//let router = ...

router.get('/dashboard', (req, res) => {
  // Simple GET with Promise handling to https://myapp.com/api/v1/reports/clients
  client.get("reports/clients")
    .then(response => {
       console.log("Report for client", response.userId)  // REST responses are parsed as JSON objects
       res.render('clients/dashboard', {title: 'Customer Report', report: response})
    })
    .catch(err => {
      console.error("Ups!", err)
      res.status(400).render('error', {error: err})
    })
})

router.get('/orders', (req, res, next) => {
  // GET with query (https://myapp.com/api/v1/orders?state=open&limit=10)
  client.get({"uri": "orders", "query": {"state": "open", "limit": 10}})
    .then(orders => {
      res.render('clients/orders', {title: 'Customer Orders', orders: orders})
    })
    .catch(err => someErrorHandler(req, res, next))
})

router.delete('/orders', (req, res, next) => {
  // DELETE with params (https://myapp.com/api/v1/orders/1234/A987)
  client.delete({
    "uri": "orders/{client}/{id}",
    "params": {"client": "A987", "id": 1234}
  })
  .then(resp => res.status(204))
  .catch(err => someErrorHandler(req, res, next))
})

reqclientঅনেক বৈশিষ্ট্য সমর্থন করে, কিন্তু এটি যে অন্যান্য লাইব্রেরি দ্বারা সমর্থিত নয় কিছু আছে: OAuth2 তে ইন্টিগ্রেশন সঙ্গে এবং এটির ইন্টিগ্রেশন কার্ল সিনট্যাক্স , এবং সবসময় নেটিভ প্রতিশ্রুতি বস্তু ফেরৎ।


0

আপনার যদি কখনও GETকোনও অনুরোধ প্রেরণের IPপাশাপাশি কোনও Domain(অন্য উত্তরগুলি উল্লেখ করে না তবে আপনি একটি portপরিবর্তনশীল নির্দিষ্ট করতে পারেন ), আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

function getCode(host, port, path, queryString) {
    console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")

    // Construct url and query string
    const requestUrl = url.parse(url.format({
        protocol: 'http',
        hostname: host,
        pathname: path,
        port: port,
        query: queryString
    }));

    console.log("(" + host + path + ")" + "Sending GET request")
    // Send request
    console.log(url.format(requestUrl))
    http.get(url.format(requestUrl), (resp) => {
        let data = '';

        // A chunk of data has been received.
        resp.on('data', (chunk) => {
            console.log("GET chunk: " + chunk);
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
            console.log("GET end of response: " + data);
        });

    }).on("error", (err) => {
        console.log("GET Error: " + err);
    });
}

আপনার ফাইলের শীর্ষে প্রয়োজনীয় মডিউলগুলি মিস করবেন না:

http = require("http");
url = require('url')

httpsসুরক্ষিত নেটওয়ার্কের মাধ্যমে যোগাযোগের জন্য আপনি মডিউলটি ব্যবহার করতে পারেন তাও মনে রাখবেন । সুতরাং এই দুটি লাইন পরিবর্তন হবে:

https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......

-1
## you can use request module and promise in express to make any request ##
const promise                       = require('promise');
const requestModule                 = require('request');

const curlRequest =(requestOption) =>{
    return new Promise((resolve, reject)=> {
        requestModule(requestOption, (error, response, body) => {
            try {
                if (error) {
                    throw error;
                }
                if (body) {

                    try {
                        body = (body) ? JSON.parse(body) : body;
                        resolve(body);
                    }catch(error){
                        resolve(body);
                    }

                } else {

                    throw new Error('something wrong');
                }
            } catch (error) {

                reject(error);
            }
        })
    })
};

const option = {
    url : uri,
    method : "GET",
    headers : {

    }
};


curlRequest(option).then((data)=>{
}).catch((err)=>{
})

(এটি হওয়ার সাথে সাথে এটি সমস্যার সমাধান করবে না This এই কোডটি একটি অনুরোধের জন্য শুনবে তবে একটি অনুরোধ কীভাবে প্রেরণ করা হবে তা প্রশ্ন করা হচ্ছে )
কোয়ান্টিন

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