cURL ที่เทียบเท่าใน Node.js?


152

ฉันต้องการใช้ข้อมูลจากคำขอ HTTP โดยใช้ Node.js (เช่นเรียกใช้บริการจากเว็บระยะไกลและสะท้อนการตอบสนองต่อลูกค้า)

ใน PHP ฉันจะใช้ cURL เพื่อทำสิ่งนี้ การปฏิบัติที่ดีที่สุดในโหนดคืออะไร?


13
http.request...
Raynos

ปัญหาของการแก้ปัญหาทั้งหมดนี้คือพวกเขาต้องการการควบคุมคอร์!
Marco

คำตอบ:


103

ดูเอกสารประกอบสำหรับโมดูล HTTP สำหรับตัวอย่างเต็มรูปแบบ:

https://nodejs.org/api/http.html#http_http_request_options_callback


10
นอกจากนี้ยังมีการชี้ให้เห็นว่ามี wrapper library ยอดนิยมมากrequest.js github.com/mikeal/request
Farzher

2
http คำขอ y async, curl ซิงค์กัน
e-info128

2
@WHK ดังกล่าวเป็นลักษณะของ node.js
slifty

ปัญหาใหญ่ที่ฉันเห็นคือคุณไม่สามารถป้อน URL และรับการตอบสนองได้ คุณต้องแยก URL เป็นหน่วยเพื่อขอมัน แต่การสาปแช่งอาจเป็นวิธีที่มันจะเป็นเรื่องง่ายที่จะใช้คำสั่งหนึ่งเหมือนคำสั่งนี้
Jānis Gruzis

15
ไซต์นี้สามารถแปลงcURLคำสั่งของคุณเป็นคำขอnode.js
Maxim Mai

74

httpโมดูลที่คุณใช้ในการใช้เซิร์ฟเวอร์ยังถูกนำมาใช้เพื่อให้การร้องขอจากระยะไกล

นี่คือตัวอย่างในเอกสารของพวกเขา:

var http = require("http");

var options = {
  host: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST'
};

var req = http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

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

// write data to request body
req.write('data\n');
req.write('data\n');
req.end();

14
นี่เป็นระดับที่ต่ำมากเมื่อเทียบกับพฤติกรรมที่คล้ายกับขดที่ OP ต้องการ
Dan Dascalescu

1
ถึงทั้งหมด: ปัจจุบันใช้request- npmjs.com/package/request - และถอนคำตอบของ Nitish ด้านล่างซึ่งเป็นคำตอบที่ดีกว่าในปี 2561
Dan Nissenbaum

ยินดีต้อนรับสู่ความเป็นจริง: คำขอเลิกใช้แล้วโปรดดูgithub.com/request/request/issues/3142ดูเหมือนว่าการดำเนินการ "ระดับต่ำ" มีศักยภาพมากกว่านี้เพราะไม่ต่ำเลยเป็นพื้นฐาน
vintproykt

35

คุณสามารถใช้โมดูลคำขอได้อย่างง่ายดาย:

https://www.npmjs.com/package/request

รหัสตัวอย่าง:

var request = require('request');
request('http://www.google.com', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body) // Show the HTML for the Google homepage. 
  }
  else {
    console.log("Error "+response.statusCode)
  }
})

27

เนื่องจากดูเหมือนว่าnode-curlจะตายแล้วฉันจึงแยกแยะเปลี่ยนชื่อและดัดแปลงให้เป็นม้วนงอมากกว่าและคอมไพล์ใน Windows

node-libcurl

ตัวอย่างการใช้งาน:

var Curl = require( 'node-libcurl' ).Curl;

var curl = new Curl();

curl.setOpt( Curl.option.URL, 'www.google.com' );
curl.setOpt( 'FOLLOWLOCATION', true );

curl.on( 'end', function( statusCode, body, headers ) {

    console.info( statusCode );
    console.info( '---' );
    console.info( body.length );
    console.info( '---' );
    console.info( headers );
    console.info( '---' );
    console.info( this.getInfo( Curl.info.TOTAL_TIME ) );

    this.close();
});

curl.on( 'error', function( err, curlErrorCode ) {

    console.error( err.message );
    console.error( '---' );
    console.error( curlErrorCode );

    this.close();

});

curl.perform();

ดำเนินการเป็นแบบอะซิงโครนัสและไม่สามารถใช้งานแบบซิงโครนัสได้ในขณะนี้ (และอาจไม่เคยมี)

มันยังอยู่ในอัลฟ่า แต่สิ่งนี้จะเปลี่ยนแปลงในไม่ช้าและความช่วยเหลือจะได้รับการชื่นชม

ตอนนี้เป็นไปได้ที่จะใช้การEasyจัดการโดยตรงสำหรับการร้องขอการซิงค์ตัวอย่าง:

var Easy = require( 'node-libcurl' ).Easy,
    Curl = require( 'node-libcurl' ).Curl,
    url = process.argv[2] || 'http://www.google.com',
    ret, ch;

ch = new Easy();

ch.setOpt( Curl.option.URL, url );

ch.setOpt( Curl.option.HEADERFUNCTION, function( buf, size, nmemb ) {

    console.log( buf );

    return size * nmemb;
});

ch.setOpt( Curl.option.WRITEFUNCTION, function( buf, size, nmemb ) {

    console.log( arguments );

    return size * nmemb;
});

// this call is sync!
ret = ch.perform();

ch.close();

console.log( ret, ret == Curl.code.CURLE_OK, Easy.strError( ret ) );

อีกทั้งโครงการยังมีเสถียรภาพในขณะนี้!


ฉันลองติดตั้งทั้ง node-curl และ node-libcurl แต่ทั้งคู่ให้ข้อความเดียวกันกับฉัน: "ไม่พบไฟล์ส่วนหัวของ curl" นี่คือระหว่างnode tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuildขั้นตอน ความคิดใด ๆ
SaganRitual

@GreatBigBore คุณต้องมีแพ็คเกจ libcurl devel ติดตั้งในเครื่องของคุณ หากคุณใช้เดเบียนคุณสามารถติดตั้งได้ด้วย$ apt-get install libcurl4-openssl-dev
JCM

1
คุณสามารถใช้-Lตัวเลือกได้หรือไม่?
corvid

2
ใช่: CURLOPT_FOLLOWLOCATIONกับโหนด libcurl curl.setOpt( 'FOLLOWLOCATION', true );คุณจะใช้ Btw คำถามเช่นนี้เหมาะสมกับตัวติดตามปัญหามากกว่าส่วนความคิดเห็นนี้ ;)
JCM

23

แก้ไข:

สำหรับโครงการใหม่โปรดอย่าใช้คำขอเนื่องจากขณะนี้โครงการอยู่ในโหมด maitainance และในที่สุดจะถูกคัดค้าน

https://github.com/request/request/issues/3142

แต่ฉันอยากจะแนะนำAxiosห้องสมุดเป็นไปตามมาตรฐานล่าสุดของ Node และมีปลั๊กอินที่พร้อมใช้งานบางส่วนในการปรับปรุงการเปิดใช้งานการตอบกลับของเซิร์ฟเวอร์จำลองการลองใหม่โดยอัตโนมัติและคุณสมบัติอื่น ๆ

https://github.com/axios/axios

const axios = require('axios');

// Make a request for a user with a given ID
axios.get('/user?ID=12345')
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });

หรือใช้ async / คอย:

try{
    const response = await axios.get('/user?ID=12345');
    console.log(response)
} catch(axiosErr){
    console.log(axiosErr)
}

ฉันมักจะใช้คำขอมันเป็นไคลเอนต์ HTTP ที่เรียบง่าย แต่ทรงพลังสำหรับ Node.js

https://github.com/request/request

มันเกี่ยวกับ NPM npm install request

นี่คือตัวอย่างการใช้งาน:

var request = require('request');

request('http://www.google.com', function (error, response, body) {
   if (!error && response.statusCode == 200) {
       console.log(body) // Show the HTML for the Google homepage.
   }
})


8

ตัวอย่างด้านบนใช้งานได้ แต่อย่าไปไกลขนาดนั้นกับตัวอย่างของโลกแห่งความเป็นจริง (เช่นเมื่อคุณประมวลผลข้อมูลที่มีหลายชิ้นสิ่งหนึ่งที่คุณต้องแน่ใจก็คือคุณมีตัวจัดการ 'แบบก้อน' ที่ พุชข้อมูลลงในอาร์เรย์ (วิธีที่เร็วที่สุดในการทำเช่นนี้ใน JS) และตัวจัดการ 'on end' ที่รวมเข้าด้วยกันเพื่อให้คุณสามารถส่งคืนได้

สิ่งนี้มีความจำเป็นอย่างยิ่งเมื่อคุณทำงานกับคำขอใหญ่ (5,000+ บรรทัด) และเซิร์ฟเวอร์จะส่งข้อมูลจำนวนมากให้คุณ

นี่คือตัวอย่างหนึ่งในโปรแกรมของฉัน (coffeescript): https://gist.github.com/1105888



4

มีโมดูล npm ที่จะทำให้การร้องขอเหมือนขด npm curlrequest .

ขั้นตอนที่ 1: $npm i -S curlrequest

ขั้นตอนที่ 2: ในไฟล์โหนดของคุณ

let curl = require('curlrequest')
let options = {} // url, method, data, timeout,data, etc can be passed as options 
curl.request(options,(err,response)=>{
// err is the error returned  from the api
// response contains the data returned from the api
})

สำหรับการอ่านและทำความเข้าใจเพิ่มเติมขอแนะนำให้ใช้ curlrequest


3

ใช้โมดูลคำขอ npm และหลังการโทร

var request = require('request');
request('http://www.google.com', function (error, response, body) {
  console.log('error:', error); // Print the error if one occurred
  console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
  console.log('body:', body); // Print the HTML for the Google homepage.
});

เพื่อการปฏิบัติที่ดีที่สุดให้ใช้โมดูลตัวบันทึกwinstonหรือ console.log แบบง่ายๆแล้วเรียกใช้แอปพลิเคชันของคุณเช่น

npm start output.txt 

ผลลัพธ์ของคำสั่งด้านบนจะสร้างไฟล์ txt หนึ่งไฟล์บนรูทพร้อมข้อมูลทั้งหมดที่คุณพิมพ์ใน console.log


1

ฉันลงเอยด้วยการใช้ไลบรารีgrunt-shell

นี่คือส่วนสำคัญของฉันสำหรับงาน Grunt ที่นำไปใช้อย่างเต็มที่สำหรับคนอื่นที่คิดเกี่ยวกับการทำงานกับ EdgeCast API คุณจะพบในตัวอย่างของฉันที่ฉันใช้ grunt-shell เพื่อรันคำสั่ง curl ซึ่งกำจัด CDN

นี่คือที่ฉันลงเอยด้วยหลังจากใช้เวลาหลายชั่วโมงพยายามรับคำขอ HTTP เพื่อทำงานภายในโหนด ฉันสามารถทำงานใน Ruby และ Python ได้ แต่ไม่ตรงตามข้อกำหนดของโครงการนี้


1

ใช้reqclientมันเป็นโมดูลไคลเอนต์ขนาดเล็กที่ด้านบนของrequestที่ช่วยให้คุณสามารถบันทึกกิจกรรมทั้งหมดด้วยสไตล์ cURL (ไม่จำเป็นสำหรับสภาพแวดล้อมการพัฒนา) นอกจากนี้ยังมีคุณสมบัติที่ดีเช่นการแยก URL และพารามิเตอร์การรวมการรับรองความถูกต้องการสนับสนุนแคชเป็นต้น

ตัวอย่างเช่นถ้าคุณสร้างวัตถุไคลเอนต์และทำคำขอ:

var RequestClient = require("reqclient").RequestClient;
var client = new RequestClient({
        baseUrl:"http://baseurl.com/api/v1.1",
        debugRequest:true, debugResponse:true
    });

var resp = client.post("client/orders", {"client":1234,"ref_id":"A987"}, {headers: {"x-token":"AFF01XX"}})

มันจะเข้าสู่ระบบภายในคอนโซลดังนี้:

[Requesting client/orders]-> -X POST http://baseurl.com/api/v1.1/client/orders -d '{"client": 1234, "ref_id": "A987"}' -H '{"x-token": "AFF01XX"}' -H Content-Type:application/json
[Response   client/orders]<- Status 200 - {"orderId": 1320934}

คำขอจะส่งคืนออบเจกต์สัญญาดังนั้นคุณต้องจัดการกับthenและcatchจะทำอย่างไรกับผลลัพธ์

reqclientสามารถใช้ได้กับNPMnpm install reqclientคุณสามารถติดตั้งโมดูลด้วย:


1

ฉันมีปัญหาในการส่งข้อมูล POST ไปยัง cloud DB จาก IOT RaspberryPi แต่หลังจากชั่วโมงฉันจัดการเพื่อให้ตรง

ฉันใช้พรอมต์คำสั่งเพื่อทำเช่นนั้น

sudo curl --URL http://<username>.cloudant.com/<database_name> --user <api_key>:<pass_key> -X POST -H "Content-Type:application/json" --data '{"id":"123","type":"987"}'

พรอมต์คำสั่งจะแสดงปัญหา - ชื่อผู้ใช้ / รหัสผ่านผิด คำขอไม่ดี ฯลฯ

- URL ฐานข้อมูล / เซิร์ฟเวอร์ (ฉันใช้ฐานข้อมูล Cloudant ง่าย ๆ ) - ผู้ใช้คือชื่อผู้ใช้ส่วนการรับรองความถูกต้อง: รหัสผ่านที่ฉันป้อนผ่าน API ผ่าน -X กำหนดคำสั่งที่จะเรียก (PUT, GET, POST, DELETE) -H - Cloudant เป็นเรื่องเกี่ยวกับฐานข้อมูลเอกสารที่ใช้ JSON - เนื้อหาข้อมูลเรียงตัวเองเป็น JSON


1

ขอโมดุล npm ขอโหนด mouldeใช้งานได้ดีมีการตั้งค่าตัวเลือกสำหรับการขอ / โพสต์รวมถึงมันถูกใช้อย่างกว้างขวางในสภาพแวดล้อมการผลิตเช่นกัน


0

คุณอาจต้องการลองใช้สิ่งนี้

curl = require('node-curl');
curl('www.google.com', function(err) {
  console.info(this.status);
  console.info('-----');
  console.info(this.body);
  console.info('-----');
  console.info(this.info('SIZE_DOWNLOAD'));
});

0

คุณสามารถลองใช้แอป POSTMAN Chrome สำหรับคำขอของคุณและคุณสามารถสร้างรหัสโหนด js จากที่นั่น


0

คุณสามารถใช้โมดูลร้องขอ npm ใช้งานง่ายสุด ๆ คำขอได้รับการออกแบบให้เป็นวิธีที่ง่ายที่สุดในการโทรผ่าน http สนับสนุน HTTPS และติดตามการเปลี่ยนเส้นทางตามค่าเริ่มต้น

var request = require('request');
request('http://www.google.com', function (error, response, body) {
  console.log('error:', error); // Print the error if one occurred
  console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
  console.log('body:', body); // Print the HTML for the Google homepage.
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.