code

Node.js에서 cURL에 해당합니까?

starcafe 2023. 10. 30. 21:09
반응형

Node.js에서 cURL에 해당합니까?

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

PHP에서 나는 cURL을 사용해서 이것을 했을 것입니다.노드에서 가장 좋은 방법은 무엇입니까?

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

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

서버를 실행하는 데 사용하는 모듈은 원격 요청에도 사용됩니다.

문서의 예는 다음과 같습니다.

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();

요청 모듈을 쉽게 사용할 수 있습니다.

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

죽은 것처럼 보이기 때문에 포크를 넣고 이름을 바꾸고 좀 더 컬(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 ) );

또한, 프로젝트는 현재 안정적입니다!

편집:

새 프로젝트의 경우 프로젝트가 유지 보수 모드이므로 요청을 사용하지 마십시오. 프로젝트는 결국 사용되지 않습니다.

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

또는 비동기 / wait를 사용하는 경우:

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

컬에 해당하는 것이 정말 필요하다면 시도해 볼 수 있습니다.

npm install node-curl

당신은 아마도 추가할 필요가 있을 것입니다.libcurl4-gnutls-dev.

위의 예들은 작동하지만 실제 세계의 예(즉, 여러 청크로 들어오는 데이터를 처리할 때)를 실제로 다루지는 못합니다.한 가지 확실하게 해야 할 것은 데이터를 배열로 밀어 넣는 'on chunk' 핸들러와 이들을 모두 결합하여 반환할 수 있도록 하는 'on end' 핸들러가 있다는 것입니다.

특히 대용량 요청(5000회선 이상)을 처리할 때 서버에서 많은 데이터를 전송할 때 필요합니다.

제 프로그램(커피 스크립트) 중 하나인 https://gist.github.com/1105888 의 예를 들어보겠습니다.

예를 들어 https://github.com/joyent/node/wiki/modules#wiki-tcp 같은 경우는 어떻습니까?아주 빠른 요약 =>

Node.js 18에서 직접 사용할 수 있습니다.

const res = await fetch('https://nodejs.org/api/documentation.json');
if (res.ok) {
  const data = await res.json();
  console.log(data);
}

curl like request 를 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 curl request.

여기 표준 lib()가 있습니다.http) 비동기 / wait 솔루션입니다.

const http = require("http");

const fetch = async (url) => {
  return new Promise((resolve, reject) => {
    http
      .get(url, (resp) => {
        let data = "";
        resp.on("data", (chunk) => {
          data += chunk;
        });
        resp.on("end", () => {
          resolve(data);
        });
      })
      .on("error", (err) => {
        reject(err);
      });
  });
};

용도:

await fetch("http://example.com");

요청 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 logger module 또는 simple console.log를 사용하고 다음과 같이 응용 프로그램을 실행합니다.

npm start output.txt 

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

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}

요청이 Promise 개체를 반환하므로 사용자는 다음과 같이 처리해야 합니다.then그리고.catch결과를 어떻게 할 것인지.

reqclientnpm 과 함께 사용할 수 있습니다. 모듈은 다음과 같이 설치할 수 있습니다.npm install reqclient.

나는 결국 grunt-shell 라이브러리를 사용하게 되었습니다.

EdgeCast API로 작업할 생각을 하고 있는 다른 사람들을 위해 완전히 구현된 Grunt 작업에 대한 나의 출처 요지는 다음과 같습니다.제 예를 보시면 제가 grunt-shell을 사용해서 CDN을 제거하는 curl 명령을 실행하는 것을 보실 수 있습니다.

이것은 노드 내에서 작동하기 위해 HTTP 요청을 받기 위해 몇 시간 동안 노력한 끝에 결국 끝이 났습니다.루비와 파이썬에서 작업할 수 있었지만, 이 프로젝트의 요구 사항을 충족하지 못했습니다.

당신은 당신의 요청에 POSTMAN Chrome 앱을 사용해 볼 수 있고 거기서 노드 js 코드를 생성할 수 있습니다.

IOT Raspberry Pi에서 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 database/server location (간단한 무료 Cloudant DB 사용) --user는 인증 부분 사용자 이름입니다:API pass를 통해 입력한 pass -X는 호출할 명령을 정의합니다 (PUT,GET,POST,DELETE) -H content type -Cloudant는 문서 데이터베이스에 관한 것으로, 여기서 JSON이 사용됩니다 --Data content 자체가 JSON으로 분류됩니다.

Request npm module Request node molde는 사용하기 좋습니다. get/post request에 대한 옵션 설정이 있고 프로덕션 환경에서도 널리 사용됩니다.

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

당신은 이런 것을 사용하는 것을 시도해 보는 것입니다.

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'));
});

정말 cURL 요청으로 처리하고 싶다면 한 가지 생각입니다(즉,페이지가 뜨는지 안 뜨는지 확인하고 싶을 뿐입니다. (@Glen Thompson 답변에서 편집):

const http = require("http");

function isSiteUp(url) {
  return new Promise((resolve, reject) => {
    http.get(url, (res) => {
      if (!err && res.statusCode == 200) {
        resolve(true);
      } else {
        console.log(err);
        resolve(false);
      }
    })
    .on("error", (err) => {
      reject(err);
    });
  });
}

언급URL : https://stackoverflow.com/questions/6819143/curl-equivalent-in-node-js

반응형