[node.js] node.js에서 HTTP POST 요청은 어떻게 이루어 집니까?

node.js에서 데이터와 함께 아웃 바운드 HTTP POST 요청을 만들려면 어떻게해야합니까?



답변

다음은 node.js를 사용하여 Google 컴파일러 API에 POST 요청을하는 예입니다.

// We need this to build our post string
var querystring = require('querystring');
var http = require('http');
var fs = require('fs');

function PostCode(codestring) {
  // Build the post string from an object
  var post_data = querystring.stringify({
      'compilation_level' : 'ADVANCED_OPTIMIZATIONS',
      'output_format': 'json',
      'output_info': 'compiled_code',
        'warning_level' : 'QUIET',
        'js_code' : codestring
  });

  // An object of options to indicate where to post to
  var post_options = {
      host: 'closure-compiler.appspot.com',
      port: '80',
      path: '/compile',
      method: 'POST',
      headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Content-Length': Buffer.byteLength(post_data)
      }
  };

  // Set up the request
  var post_req = http.request(post_options, function(res) {
      res.setEncoding('utf8');
      res.on('data', function (chunk) {
          console.log('Response: ' + chunk);
      });
  });

  // post the data
  post_req.write(post_data);
  post_req.end();

}

// This is an async file read
fs.readFile('LinkedList.js', 'utf-8', function (err, data) {
  if (err) {
    // If this were just a small part of the application, you would
    // want to handle this differently, maybe throwing an exception
    // for the caller to handle. Since the file is absolutely essential
    // to the program's functionality, we're going to exit with a fatal
    // error instead.
    console.log("FATAL An error occurred trying to read in the file: " + err);
    process.exit(-2);
  }
  // Make sure there's data before we post it
  if(data) {
    PostCode(data);
  }
  else {
    console.log("No data to post");
    process.exit(-1);
  }
});

하드 코드 된 문자열 대신 파일에서 데이터를 게시하는 방법을 보여주기 위해 코드를 업데이트했습니다. fs.readFile이를 달성하기 위해 async 명령을 사용하여 읽은 후 실제 코드를 게시합니다. 오류가 있으면 오류가 발생하고 데이터가 없으면 프로세스는 음수 값으로 종료하여 실패를 나타냅니다.


답변

요청 라이브러리 를 사용하면 훨씬 쉬워집니다 .

var request = require('request');

request.post(
    'http://www.yoursite.com/formpage',
    { json: { key: 'value' } },
    function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body);
        }
    }
);

멋진 구문을 제공하는 것 외에도 json 요청을 쉽게하고 oauth 서명 (예 : 트위터 등)을 처리하고 여러 부분으로 된 양식 (예 : 파일 업로드) 및 스트리밍을 수행 할 수 있습니다.

요청 사용 명령을 설치하려면 npm install request


답변

요청 라이브러리를 사용할 수 있습니다. https://www.npmjs.com/package/request

var request = require('request');

JSON 데이터를 게시하려면

var myJSONObject = { ... };
request({
    url: "http://josiahchoi.com/myjson",
    method: "POST",
    json: true,   // <--Very important!!!
    body: myJSONObject
}, function (error, response, body){
    console.log(response);
});

xml 데이터를 게시하려면

var myXMLText = '<xml>...........</xml>'
request({
    url: "http://josiahchoi.com/myjson",
    method: "POST",
    headers: {
        "content-type": "application/xml",  // <--Very important!!!
    },
    body: myXMLText
}, function (error, response, body){
    console.log(response);
});


답변

생산 목적으로 RestlerNeedle 을 사용 합니다. 그것들은 네이티브 httprequest보다 훨씬 강력합니다. 기본 인증, 특수 헤더 항목 또는 파일 업로드 / 다운로드로 요청할 수 있습니다.

post / get 작업의 경우 httprequest를 사용하는 원시 ajax 호출보다 사용이 훨씬 간단합니다.

needle.post('https://my.app.com/endpoint', {foo:'bar'},
    function(err, resp, body){
        console.log(body);
});


답변

간단하고 의존성이 없습니다. 약속을 사용하여 결과를 기다릴 수 있습니다. 응답 본문을 반환하고 응답 상태 코드를 확인하지 않습니다.

const https = require('https');

function httpsPost({body, ...options}) {
    return new Promise((resolve,reject) => {
        const req = https.request({
            method: 'POST',
            ...options,
        }, res => {
            const chunks = [];
            res.on('data', data => chunks.push(data))
            res.on('end', () => {
                let body = Buffer.concat(chunks);
                switch(res.headers['content-type']) {
                    case 'application/json':
                        body = JSON.parse(body);
                        break;
                }
                resolve(body)
            })
        })
        req.on('error',reject);
        if(body) {
            req.write(body);
        }
        req.end();
    })
}

용법:

const res = await httpsPost({
    hostname: 'sentry.io',
    path: `/api/0/organizations/org/releases/${changesetId}/deploys/`,
    headers: {
        'Authorization': `Bearer ${process.env.SENTRY_AUTH_TOKEN}`,
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        environment: isLive ? 'production' : 'demo',
    })
})


답변

nodeJS + 용으로 작성한 정말 시원하고 간단한 HTTP 클라이언트 인 Requestify 를 사용할 수 있습니다 . 캐싱을 지원합니다.

다음을 수행하십시오.

    var requestify = require('requestify');

    requestify.post('http://example.com', {
        hello: 'world'
    })
    .then(function(response) {
        // Get the response body (JSON parsed or jQuery object for XMLs)
        response.getBody();
    });


답변

2020 업데이트 :

난 정말 즐기고했습니다 망막 기억을울트라 경량 Node.js를 HTTP 클라이언트를

두 가지 방법으로 사용할 수 있습니다. 하나는 약속 (Async / Await)이고 다른 하나는 전통적인 콜백 스타일입니다.

다음을 통해 설치하십시오. npm i phin

README에서 await다음을 사용하십시오 .

const p = require('phin')

await p({
    url: 'https://ethanent.me',
    method: 'POST',
    data: {
        hey: 'hi'
    }
})

확실하지 않은 (콜백) 스타일 :

const p = require('phin').unpromisified

p('https://ethanent.me', (err, res) => {
    if (!err) console.log(res.body)
})

현재 2,015 최소 코딩이 수행 할 수있는 다른 라이브러리의 다양한 해주기있다. 저수준 HTTP 항목에 대한 제어가 절대적으로 필요하지 않으면 HTTP 요청에 대해 우아한 경량 라이브러리를 선호합니다.

그러한 라이브러리 중 하나는 Unirest입니다

설치하려면를 사용하십시오 npm.
$ npm install unirest

그리고 Hello, World!모든 사람에게 익숙한 모범에.

var unirest = require('unirest');

unirest.post('http://example.com/helloworld')
.header('Accept', 'application/json')
.send({ "Hello": "World!" })
.end(function (response) {
  console.log(response.body);
});

추가 :
많은 사람들이 요청 사용을 제안하고 있습니다 [2]

무대 뒤에서 라이브러리를 Unirest사용 한다는 점은 주목할 가치가 request있습니다.

Unirest는 요청 객체에 직접 액세스하기위한 메소드를 제공합니다.

예:

var Request = unirest.get('http://mockbin.com/request');