Node.js에서 cURL이 동일합니까?


152

Node.js를 사용하여 HTTP 요청의 정보를 사용하려고합니다 (즉, 원격 웹 서비스를 호출하고 클라이언트에 응답을 에코합니다).

PHP에서는 cURL을 사용 하여이 작업을 수행했을 것입니다. 노드에서 가장 좋은 방법은 무엇입니까?


13
http.request...
Raynos

이 모든 솔루션의 문제점은 cors의 제어가 필요하다는 것입니다!
Marco

답변:


103

전체 예는 HTTP 모듈 설명서를 참조하십시오.

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


10
매우 인기있는 래퍼 라이브러리 request.js github.com/mikeal/request
Farzher

2
http 요청 및 비동기, curl이 동기화되었습니다.
e-info128

2
@WHK는 node.js의 본질입니다
slifty

내가 볼 수있는 큰 문제는 단순히 URL을 입력하고 응답을 얻을 수 없다는 것입니다. 요청하려면 URL을 단위로 분리해야합니다. 그러나 저주에는 아마도 방법이있을 것입니다.이 명령에 대해 하나의 컬을 사용하는 것이 더 편리합니다.
Jānis Gruzis

15
이 사이트는 cURL명령을 node.js 요청으로 변환 할 수 있습니다 . curl.trillworks.com/#node
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 - 그리고 upvote에 Nitish의 대답은, 아래, 2018 년에 더 나은 답변입니다
댄 Nissenbaum

현실에 오신 것을 환영합니다 : 요청은 더 이상 사용되지 않습니다. github.com/request/request/issues/3142를 참조하십시오. "낮은 수준의"작업이 이보다 더 잠재력이있는 것 같습니다. 전혀 낮지 않기 때문에 BASIC
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 , node-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 / await 사용 :

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

나는 보통 Node.js를위한 간단하지만 강력한 HTTP 클라이언트 인 REQUEST를 사용합니다.

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

9

당신이 정말로 컬 동등한 것을 필요로한다면 당신은 시도 할 수 있습니다 node-curl

npm install node-curl

아마 추가해야 할 것입니다 libcurl4-gnutls-dev.


8

위의 예제는 실제로 작동하지만 실제 예제를 다루기에는 충분하지 않습니다 (예 : 여러 청크로 들어오는 데이터를 처리 할 때). 데이터를 배열 (JS 에서이 작업을 수행하는 가장 빠른 방법)에 푸시하고 데이터를 모두 결합하여 반환 할 수있는 '종료'처리기로 푸시하십시오.

이는 큰 요청 (5000 줄 이상)으로 작업하고 서버가 많은 데이터를 전송하는 경우에 특히 필요합니다.

내 프로그램 (커피 스크립트) 중 하나의 예는 다음과 같습니다. 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
})

더 읽고 이해하기 위해 npm 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.
});

모범 사례를 위해 일부 윈스턴 로거 모듈 또는 간단한 console.log를 사용하고 다음과 같이 응용 프로그램을 실행하십시오.

npm start output.txt 

위 명령의 결과는 console.log에 인쇄 한 모든 데이터와 함께 하나의 txt 파일을 루트에 생성합니다.


1

나는 grunt-shell 라이브러리를 사용했다.

다음 은 EdgeCast API 작업을 생각하는 다른 사람들을 위해 완전히 구현 된 Grunt 작업의 소스 요지입니다. 내 예제에서 grunt-shell을 사용하여 CDN을 제거하는 curl 명령을 실행한다는 것을 알 수 있습니다.

이것은 노드 내에서 HTTP 요청을 작동 시키려고 몇 시간을 보낸 후에 끝났습니다. 루비와 파이썬에서 일할 수 있었지만이 프로젝트의 요구 사항을 충족시키지 못했습니다.


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어떤 결과를 함께 할 수있는.

reqclientnpm 과 함께 사용할 수있는 경우 다음을 사용하여 모듈을 설치할 수 있습니다 npm install reqclient.


1

IOT RaspberryPi에서 POST 데이터를 클라우드 DB로 전송하는 데 문제가 있었지만 몇 시간이 지나면 곧바로 얻을 수있었습니다.

명령 프롬프트를 사용하여 그렇게했습니다.

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 DB 사용)-사용자는 인증 파트 username : pass를 통해 입력 한 인증 부분입니다 .X는 호출 할 명령 (PUT, GET, POST, DELETE)을 정의합니다. -H 컨텐츠 유형 Cloudant는 JSON이 사용되는 문서 데이터베이스에 관한 것입니다. 데이터 콘텐츠 자체는 JSON으로 정렬됩니다.



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

request npm module을 사용할 수 있습니다. 사용하기 매우 간단합니다. 요청은 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.