ฉันจะสร้างคำร้องขอ HTTP POST ขาออกพร้อมข้อมูลใน node.js ได้อย่างไร
node-fetch
ซึ่งเป็นการดำเนินการตามfetch
วิธี JavaScript ดั้งเดิมเพื่อทำการร้องขอ HTTP
ฉันจะสร้างคำร้องขอ HTTP POST ขาออกพร้อมข้อมูลใน node.js ได้อย่างไร
node-fetch
ซึ่งเป็นการดำเนินการตามfetch
วิธี JavaScript ดั้งเดิมเพื่อทำการร้องขอ HTTP
คำตอบ:
นี่คือตัวอย่างของการใช้ node.js เพื่อทำการร้องขอ POST ไปยัง Google Compiler API:
// 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);
}
});
ฉันได้อัปเดตรหัสเพื่อแสดงวิธีโพสต์ข้อมูลจากไฟล์แทนที่จะเป็นสตริงฮาร์ดโค้ด มันใช้ asyncfs.readFile
คำสั่งเพื่อให้บรรลุนี้โพสต์รหัสจริงหลังจากอ่านประสบความสำเร็จ หากมีข้อผิดพลาดมันจะถูกโยนและหากไม่มีข้อมูลที่กระบวนการออกไปพร้อมกับค่าลบเพื่อระบุความล้มเหลว
Content-Length
เป็นไบต์และไม่จำเป็นต้องมีความยาวสตริง (UTF-16 เป็นต้น) การใช้Buffer.byteLength(data)
จะถูกต้องเสมอ
querystring.stringify
ควรเป็นวัตถุข้อมูลของคุณเองไม่ใช่ขยะที่แสดงในคำตอบนี้ (ซึ่งอาจเป็นประโยชน์สำหรับวัตถุที่ใช้ไฟล์?) ฉันติดอยู่กับเรื่องนั้น
สิ่งนี้จะง่ายขึ้นมากถ้าคุณใช้ไลบรารีคำขอ
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 (สำหรับ twitter ฯลฯ ) สามารถทำรูปแบบหลายส่วน (เช่นสำหรับการอัปโหลดไฟล์) และสตรีมมิ่ง
ในการติดตั้งคำขอใช้คำสั่ง 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);
});
ฉันใช้Restler and Needleเพื่อจุดประสงค์ในการผลิต ทั้งคู่มีประสิทธิภาพมากกว่า httprequest ดั้งเดิม เป็นไปได้ที่จะร้องขอด้วยการรับรองความถูกต้องเบื้องต้นรายการส่วนหัวพิเศษหรือแม้กระทั่งอัพโหลด / ดาวน์โหลดไฟล์
สำหรับการดำเนินการโพสต์ / รับพวกเขายังใช้ง่ายกว่าการโทร ajax แบบ raw โดยใช้ httprequest
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',
})
})
write
วิธีการในการreq,write()
ใช้สำหรับ?
คุณยังสามารถใช้Requestifyซึ่งเป็นไคลเอนต์ HTTP ที่ยอดเยี่ยมและเรียบง่ายที่ฉันเขียนสำหรับ nodeJS + ซึ่งรองรับการแคช
เพียงทำต่อไปนี้:
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:
ฉันสนุกกับphinจริง ๆ- ไคลเอ็นต์ HTTP Node.js ที่บางเบามาก
สามารถใช้งานได้สองวิธี หนึ่งรายการพร้อมสัญญา (Async / Await) และอีกรุ่นหนึ่งพร้อมสไตล์การโทรกลับแบบดั้งเดิม
ติดตั้งผ่าน: npm i phin
ส่งตรงจาก README ด้วยawait
:
const p = require('phin')
await p({
url: 'https://ethanent.me',
method: 'POST',
data: {
hey: 'hi'
}
})
สไตล์ Unpromisifed (โทรกลับ):
const p = require('phin').unpromisified
p('https://ethanent.me', (err, res) => {
if (!err) console.log(res.body)
})
ในปี 2558ปัจจุบันมีห้องสมุดที่แตกต่างหลากหลายที่สามารถทำสิ่งนี้ได้ด้วยการเข้ารหัสน้อยที่สุด ฉันชอบไลบรารี่ที่มีน้ำหนักเบามากสำหรับคำขอ 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');
var https = require('https');
/**
* HOW TO Make an HTTP Call - POST
*/
// do a POST request
// create the JSON object
jsonObject = JSON.stringify({
"message" : "The web of things is approaching, let do some tests to be ready!",
"name" : "Test message posted with node.js",
"caption" : "Some tests with node.js",
"link" : "http://www.youscada.com",
"description" : "this is a description",
"picture" : "http://youscada.com/wp-content/uploads/2012/05/logo2.png",
"actions" : [ {
"name" : "youSCADA",
"link" : "http://www.youscada.com"
} ]
});
// prepare the header
var postheaders = {
'Content-Type' : 'application/json',
'Content-Length' : Buffer.byteLength(jsonObject, 'utf8')
};
// the post options
var optionspost = {
host : 'graph.facebook.com',
port : 443,
path : '/youscada/feed?access_token=your_api_key',
method : 'POST',
headers : postheaders
};
console.info('Options prepared:');
console.info(optionspost);
console.info('Do the POST call');
// do the POST call
var reqPost = https.request(optionspost, function(res) {
console.log("statusCode: ", res.statusCode);
// uncomment it for header details
// console.log("headers: ", res.headers);
res.on('data', function(d) {
console.info('POST result:\n');
process.stdout.write(d);
console.info('\n\nPOST completed');
});
});
// write the json data
reqPost.write(jsonObject);
reqPost.end();
reqPost.on('error', function(e) {
console.error(e);
});
มีไลบรารีโอเพ่นซอร์สมากมายที่คุณสามารถใช้เพื่อสร้างการร้องขอ HTTP POST ในโหนด
const axios = require('axios');
const data = {
name: 'John Doe',
job: 'Content Writer'
};
axios.post('https://reqres.in/api/users', data)
.then((res) => {
console.log(`Status: ${res.status}`);
console.log('Body: ', res.data);
}).catch((err) => {
console.error(err);
});
const needle = require('needle');
const data = {
name: 'John Doe',
job: 'Content Writer'
};
needle('post', 'https://reqres.in/api/users', data, {json: true})
.then((res) => {
console.log(`Status: ${res.statusCode}`);
console.log('Body: ', res.body);
}).catch((err) => {
console.error(err);
});
const request = require('request');
const options = {
url: 'https://reqres.in/api/users',
json: true,
body: {
name: 'John Doe',
job: 'Content Writer'
}
};
request.post(options, (err, res, body) => {
if (err) {
return console.log(err);
}
console.log(`Status: ${res.statusCode}`);
console.log(body);
});
const https = require('https');
const data = JSON.stringify({
name: 'John Doe',
job: 'Content Writer'
});
const options = {
hostname: 'reqres.in',
path: '/api/users',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': data.length
}
};
const req = https.request(options, (res) => {
let data = '';
console.log('Status Code:', res.statusCode);
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('Body: ', JSON.parse(data));
});
}).on("error", (err) => {
console.log("Error: ", err.message);
});
req.write(data);
req.end();
นี่เป็นวิธีที่ง่ายที่สุดที่ฉันใช้ในการร้องขอ: ใช้โมดูล 'คำขอ'
คำสั่งในการติดตั้งโมดูล 'คำขอ':
$ npm install request
รหัสตัวอย่าง:
var request = require('request')
var options = {
method: 'post',
body: postData, // Javascript object
json: true, // Use,If you are sending JSON data
url: url,
headers: {
// Specify headers, If any
}
}
request(options, function (err, res, body) {
if (err) {
console.log('Error :', err)
return
}
console.log(' Body :', body)
});
คุณยังสามารถใช้โมดูล 'http' ในตัวของ Node.js เพื่อทำการร้องขอ
ฉันชอบความเรียบง่ายของ superagent ( https://github.com/visionmedia/superagent ) API เดียวกันบนทั้งโหนดและเบราว์เซอร์
;(async function() {
var response = await superagent.post('http://127.0.0.1:8125/', {age: 2})
console.log(response)
})
นอกจากนี้ยังมีการดึงข้อมูลโหนด ( https://www.npmjs.com/package/node-fetch ) ซึ่งมี API ที่ตรงกับfetch
จากเบราว์เซอร์ - อย่างไรก็ตามสิ่งนี้ต้องการการเข้ารหัสสตริงข้อความค้นหาด้วยตนเองไม่ได้จัดการประเภทเนื้อหาโดยอัตโนมัติหรือ ดังนั้น superagent อื่น ๆ
หากคุณกำลังมองหาคำขอ HTTP ตามสัญญาAxiosทำงานได้ดี
const axios = require('axios');
axios.post('/user', {firstName: 'Fred',lastName: 'Flintstone'})
.then((response) => console.log(response))
.catch((error) => console.log(error));
หรือ
await axios.post('/user', {firstName: 'Fred',lastName: 'Flintstone'})
ในการโพสต์คำขอส่วนที่เหลือ / คำขอ JSON
เราสามารถใช้แพคเกจคำขอและบันทึกค่าที่เราต้องส่งในตัวแปร Json
ขั้นแรกให้ติดตั้งแพ็คเกจที่ต้องการในคอนโซลของคุณโดย คำขอติดตั้ง npm - บันทึก
var request = require('request');
var options={
'key':'28',
'key1':'value',
'key2':'value'
}
request({
url:"http://dev.api.ean.com/ean-services/rs/hotel/v3/ping?
minorRev="+options.key+
"&cid="+options.key1+
"&apiKey="+options.key2,
method:"POST",
json:true},function(error,response,body){
console.log(body)
}
);
ฉันพบวิดีโอที่อธิบายเกี่ยวกับวิธีการทำให้สำเร็จ: https://www.youtube.com/watch?v=nuw48-u3Yrg
มันใช้โมดูล "http" เริ่มต้นพร้อมกับโมดูล "querystring" และ "stringbuilder" แอปพลิเคชันใช้ตัวเลขสองตัว (โดยใช้สองช่องข้อความ) จากหน้าเว็บและเมื่อส่งจะส่งคืนผลรวมของทั้งสองนั้น (รวมถึงค่าคงที่ในกล่องข้อความ) นี่คือตัวอย่างที่ดีที่สุดที่ฉันสามารถหาได้จากที่อื่น
var http = require("http");
var qs = require("querystring");
var StringBuilder = require("stringbuilder");
var port = 9000;
function getCalcHtml(req, resp, data) {
var sb = new StringBuilder({ newline: "\r\n" });
sb.appendLine("<html>");
sb.appendLine(" <body>");
sb.appendLine(" <form method='post'>");
sb.appendLine(" <table>");
sb.appendLine(" <tr>");
sb.appendLine(" <td>Enter First No: </td>");
if (data && data.txtFirstNo) {
sb.appendLine(" <td><input type='text' id='txtFirstNo' name='txtFirstNo' value='{0}'/></td>", data.txtFirstNo);
}
else {
sb.appendLine(" <td><input type='text' id='txtFirstNo' name='txtFirstNo' /></td>");
}
sb.appendLine(" </tr>");
sb.appendLine(" <tr>");
sb.appendLine(" <td>Enter Second No: </td>");
if (data && data.txtSecondNo) {
sb.appendLine(" <td><input type='text' id='txtSecondNo' name='txtSecondNo' value='{0}'/></td>", data.txtSecondNo);
}
else {
sb.appendLine(" <td><input type='text' id='txtSecondNo' name='txtSecondNo' /></td>");
}
sb.appendLine(" </tr>");
sb.appendLine(" <tr>");
sb.appendLine(" <td><input type='submit' value='Calculate' /></td>");
sb.appendLine(" </tr>");
if (data && data.txtFirstNo && data.txtSecondNo) {
var sum = parseInt(data.txtFirstNo) + parseInt(data.txtSecondNo);
sb.appendLine(" <tr>");
sb.appendLine(" <td>Sum: {0}</td>", sum);
sb.appendLine(" </tr>");
}
sb.appendLine(" </table>");
sb.appendLine(" </form>")
sb.appendLine(" </body>");
sb.appendLine("</html>");
sb.build(function (err, result) {
resp.write(result);
resp.end();
});
}
function getCalcForm(req, resp, data) {
resp.writeHead(200, { "Content-Type": "text/html" });
getCalcHtml(req, resp, data);
}
function getHome(req, resp) {
resp.writeHead(200, { "Content-Type": "text/html" });
resp.write("<html><html><head><title>Home</title></head><body>Want to some calculation? Click <a href='/calc'>here</a></body></html>");
resp.end();
}
function get404(req, resp) {
resp.writeHead(404, "Resource Not Found", { "Content-Type": "text/html" });
resp.write("<html><html><head><title>404</title></head><body>404: Resource not found. Go to <a href='/'>Home</a></body></html>");
resp.end();
}
function get405(req, resp) {
resp.writeHead(405, "Method not supported", { "Content-Type": "text/html" });
resp.write("<html><html><head><title>405</title></head><body>405: Method not supported</body></html>");
resp.end();
}
http.createServer(function (req, resp) {
switch (req.method) {
case "GET":
if (req.url === "/") {
getHome(req, resp);
}
else if (req.url === "/calc") {
getCalcForm(req, resp);
}
else {
get404(req, resp);
}
break;
case "POST":
if (req.url === "/calc") {
var reqBody = '';
req.on('data', function (data) {
reqBody += data;
if (reqBody.length > 1e7) { //10MB
resp.writeHead(413, 'Request Entity Too Large', { 'Content-Type': 'text/html' });
resp.end('<!doctype html><html><head><title>413</title></head><body>413: Request Entity Too Large</body></html>');
}
});
req.on('end', function () {
var formData = qs.parse(reqBody);
getCalcForm(req, resp, formData);
});
}
else {
get404(req, resp);
}
break;
default:
get405(req, resp);
break;
}
}).listen(port);
การแก้ปัญหาของฉันและPOST
GET
เกี่ยวกับPost
วิธีการ:
หากร่างกายเป็นวัตถุ JSON ดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องทำการยกเลิกการ deserialize ด้วย JSON.stringify
และอาจตั้งค่าContent-Lenght
ส่วนหัวตามลำดับ:
var bodyString=JSON.stringify(body)
var _headers = {
'Content-Length': Buffer.byteLength(bodyString)
};
ก่อนที่จะเขียนลงในคำขอ:
request.write( bodyString );
เกี่ยวกับทั้งสองGet
และPost
วิธีการ:
timeout
สามารถเกิดขึ้นเป็นsocket
ปลดการเชื่อมต่อดังนั้นคุณต้องลงทะเบียนตัวจัดการของมันเช่น:
request.on('socket', function (socket) {
socket.setTimeout( self.timeout );
socket.on('timeout', function() {
request.abort();
if(timeout) return timeout( new Error('request timed out') );
});
});
ในขณะที่request
ตัวจัดการคือ
request.on('timeout', function () {
// Timeout happend. Server received request, but not handled it
// (i.e. doesn't send any response or it took to long).
// You don't know what happend.
// It will emit 'error' message as well (with ECONNRESET code).
req.abort();
if(timeout) return timeout( new Error('request timed out') );
});
ฉันขอแนะนำให้ลงทะเบียนตัวจัดการทั้งสอง
เนื้อความการตอบสนองถูก chunked ดังนั้นคุณต้องต่อชิ้นส่วนให้ตรงกับdata
ตัวจัดการ:
var body = '';
response.on('data', function(d) {
body += d;
});
ที่จะมีการตอบสนองของร่างกายทั้งหมด:end
body
response.on('end', function() {
try {
var jsonResponse=JSON.parse(body);
if(success) return success( jsonResponse );
} catch(ex) { // bad json
if(error) return error(ex.toString());
}
});
มันปลอดภัยที่จะห่อด้วยtry
... catchthe
JSON.parse` เนื่องจากคุณไม่สามารถแน่ใจได้ว่าเป็น json ที่มีรูปแบบที่ดีจริง ๆ และไม่มีวิธีที่จะแน่ใจได้ในเวลาที่คุณร้องขอ
โมดูล: SimpleAPI
/**
* Simple POST and GET
* @author Loreto Parisi (loretoparisi at gmail dot com)
*/
(function() {
var SimpleAPI;
SimpleAPI = (function() {
var qs = require('querystring');
/**
* API Object model
* @author Loreto Parisi (loretoparisi at gmail dot com)
*/
function SimpleAPI(host,port,timeout,ssl,debug,json) {
this.host=host;
this.port=port;
this.timeout=timeout;
/** true to use ssl - defaults to true */
this.ssl=ssl || true;
/** true to console log */
this.debug=debug;
/** true to parse response as json - defaults to true */
this.json= (typeof(json)!='undefined')?json:true;
this.requestUrl='';
if(ssl) { // use ssl
this.http = require('https');
} else { // go unsafe, debug only please
this.http = require('http');
}
}
/**
* HTTP GET
* @author Loreto Parisi (loretoparisi at gmail dot com)
*/
SimpleAPI.prototype.Get = function(path, headers, params, success, error, timeout) {
var self=this;
if(params) {
var queryString=qs.stringify(params);
if( queryString ) {
path+="?"+queryString;
}
}
var options = {
headers : headers,
hostname: this.host,
path: path,
method: 'GET'
};
if(this.port && this.port!='80') { // port only if ! 80
options['port']=this.port;
}
if(self.debug) {
console.log( "SimpleAPI.Get", headers, params, options );
}
var request=this.http.get(options, function(response) {
if(self.debug) { // debug
console.log( JSON.stringify(response.headers) );
}
// Continuously update stream with data
var body = '';
response.on('data', function(d) {
body += d;
});
response.on('end', function() {
try {
if(self.json) {
var jsonResponse=JSON.parse(body);
if(success) return success( jsonResponse );
}
else {
if(success) return success( body );
}
} catch(ex) { // bad json
if(error) return error( ex.toString() );
}
});
});
request.on('socket', function (socket) {
socket.setTimeout( self.timeout );
socket.on('timeout', function() {
request.abort();
if(timeout) return timeout( new Error('request timed out') );
});
});
request.on('error', function (e) {
// General error, i.e.
// - ECONNRESET - server closed the socket unexpectedly
// - ECONNREFUSED - server did not listen
// - HPE_INVALID_VERSION
// - HPE_INVALID_STATUS
// - ... (other HPE_* codes) - server returned garbage
console.log(e);
if(error) return error(e);
});
request.on('timeout', function () {
// Timeout happend. Server received request, but not handled it
// (i.e. doesn't send any response or it took to long).
// You don't know what happend.
// It will emit 'error' message as well (with ECONNRESET code).
req.abort();
if(timeout) return timeout( new Error('request timed out') );
});
self.requestUrl = (this.ssl?'https':'http') + '://' + request._headers['host'] + request.path;
if(self.debug) {
console.log("SimpleAPI.Post",self.requestUrl);
}
request.end();
} //RequestGet
/**
* HTTP POST
* @author Loreto Parisi (loretoparisi at gmail dot com)
*/
SimpleAPI.prototype.Post = function(path, headers, params, body, success, error, timeout) {
var self=this;
if(params) {
var queryString=qs.stringify(params);
if( queryString ) {
path+="?"+queryString;
}
}
var bodyString=JSON.stringify(body)
var _headers = {
'Content-Length': Buffer.byteLength(bodyString)
};
for (var attrname in headers) { _headers[attrname] = headers[attrname]; }
var options = {
headers : _headers,
hostname: this.host,
path: path,
method: 'POST',
qs : qs.stringify(params)
};
if(this.port && this.port!='80') { // port only if ! 80
options['port']=this.port;
}
if(self.debug) {
console.log( "SimpleAPI.Post\n%s\n%s", JSON.stringify(_headers,null,2), JSON.stringify(options,null,2) );
}
if(self.debug) {
console.log("SimpleAPI.Post body\n%s", JSON.stringify(body,null,2) );
}
var request=this.http.request(options, function(response) {
if(self.debug) { // debug
console.log( JSON.stringify(response.headers) );
}
// Continuously update stream with data
var body = '';
response.on('data', function(d) {
body += d;
});
response.on('end', function() {
try {
console.log("END", body);
var jsonResponse=JSON.parse(body);
if(success) return success( jsonResponse );
} catch(ex) { // bad json
if(error) return error(ex.toString());
}
});
});
request.on('socket', function (socket) {
socket.setTimeout( self.timeout );
socket.on('timeout', function() {
request.abort();
if(timeout) return timeout( new Error('request timed out') );
});
});
request.on('error', function (e) {
// General error, i.e.
// - ECONNRESET - server closed the socket unexpectedly
// - ECONNREFUSED - server did not listen
// - HPE_INVALID_VERSION
// - HPE_INVALID_STATUS
// - ... (other HPE_* codes) - server returned garbage
console.log(e);
if(error) return error(e);
});
request.on('timeout', function () {
// Timeout happend. Server received request, but not handled it
// (i.e. doesn't send any response or it took to long).
// You don't know what happend.
// It will emit 'error' message as well (with ECONNRESET code).
req.abort();
if(timeout) return timeout( new Error('request timed out') );
});
self.requestUrl = (this.ssl?'https':'http') + '://' + request._headers['host'] + request.path;
if(self.debug) {
console.log("SimpleAPI.Post",self.requestUrl);
}
request.write( bodyString );
request.end();
} //RequestPost
return SimpleAPI;
})();
module.exports = SimpleAPI
}).call(this);
การใช้งาน:
// Parameters
// domain: example.com
// ssl:true, port:80
// timeout: 30 secs
// debug: true
// json response:true
var api = new SimpleAPI('posttestserver.com', 80, 1000 * 10, true, true, true);
var headers = {
'Content-Type' : 'application/json',
'Accept' : 'application/json'
};
var params = {
"dir" : "post-test"
};
var method = 'post.php';
api.Post(method, headers, params, body
, function(response) { // success
console.log( response );
}
, function(error) { // error
console.log( error.toString() );
}
, function(error) { // timeout
console.log( new Error('timeout error') );
});
หลังจากดิ้นรนมากในขณะที่สร้างยูทิลิตี้ระดับต่ำเพื่อจัดการโพสต์และรับคำขอสำหรับโครงการของฉันฉันตัดสินใจโพสต์ความพยายามของฉันที่นี่ ส่วนใหญ่เป็นคำตอบที่ได้รับการยอมรับนี่เป็นตัวอย่างสำหรับการร้องขอ http และ https POST สำหรับการส่งข้อมูล JSON
const http = require("http")
const https = require("https")
// Request handler function
let postJSON = (options, postData, callback) => {
// Serializing JSON
post_data = JSON.stringify(postData)
let port = options.port == 443 ? https : http
// Callback function for the request
let req = port.request(options, (res) => {
let output = ''
res.setEncoding('utf8')
// Listener to receive data
res.on('data', (chunk) => {
output += chunk
});
// Listener for intializing callback after receiving complete response
res.on('end', () => {
let obj = JSON.parse(output)
callback(res.statusCode, obj)
});
});
// Handle any errors occurred while making request
req.on('error', (err) => {
//res.send('error: ' + err.message)
});
// Request is made here, with data as string or buffer
req.write(post_data)
// Ending the request
req.end()
};
let callPost = () => {
let data = {
'name': 'Jon',
'message': 'hello, world'
}
let options = {
host: 'domain.name', // Your domain name
port: 443, // 443 for https and 80 for http
path: '/path/to/resource', // Path for the request
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data)
}
}
postJSON(options, data, (statusCode, result) => {
// Handle response
// Process the received data
});
}
let request = require('request');
let jsonObj = {};
request({
url: "https://myapii.com/sendJsonData",
method: "POST",
json: true,
body: jsonObj
}, function (error, resp, body){
console.log(resp);
});
หรือคุณสามารถใช้ห้องสมุดนี้:
let axios = require("axios");
let jsonObj = {};
const myJsonAPI = axios.create({
baseURL: 'https://myapii.com',
timeout: 120*1000
});
let response = await myJsonAPI.post("sendJsonData",jsonobj).catch(e=>{
res.json(e);
});
console.log(response);
request
ไลบรารี่เลิกใช้แล้ว
Axios เป็นไคลเอนต์ HTTP ตามสัญญาสำหรับเบราว์เซอร์และ Node.js Axios ทำให้ง่ายต่อการส่งคำขอ HTTP แบบอะซิงโครนัสไปยังปลายทาง REST และดำเนินการ CRUD สามารถใช้ใน JavaScript ธรรมดาหรือกับไลบรารีเช่น Vue หรือ React
const axios = require('axios');
var dataToPost = {
email: "your email",
password: "your password"
};
let axiosConfiguration = {
headers: {
'Content-Type': 'application/json;charset=UTF-8',
"Access-Control-Allow-Origin": "*",
}
};
axios.post('endpoint or url', dataToPost, axiosConfiguration)
.then((res) => {
console.log("Response: ", res);
})
.catch((err) => {
console.log("error: ", err);
})
การโพสต์ตัวอย่าง axios อื่นของคำขอ axios.post ที่ใช้ตัวเลือกการกำหนดค่าเพิ่มเติมและส่วนหัวที่กำหนดเอง
var postData = {
email: "test@test.com",
password: "password"
};
let axiosConfig = {
headers: {
'Content-Type': 'application/json;charset=UTF-8',
"Access-Control-Allow-Origin": "*",
}
};
axios.post('http://<host>:<port>/<path>', postData, axiosConfig)
.then((res) => {
console.log("RESPONSE RECEIVED: ", res);
})
.catch((err) => {
console.log("AXIOS ERROR: ", err);
})
โดยใช้คำขอขึ้นอยู่กับ
วิธีแก้ปัญหาง่าย ๆ :
import request from 'request'
var data = {
"host":"127.1.1.1",
"port":9008
}
request.post( baseUrl + '/peers/connect',
{
json: data, // your payload data placed here
headers: {
'X-Api-Key': 'dajzmj6gfuzmbfnhamsbuxivc', // if authentication needed
'Content-Type': 'application/json'
}
}, function (error, response, body) {
if (error) {
callback(error, null)
} else {
callback(error, response.body)
}
});
request
มาจากไหน?
Request-Promise
ให้การตอบสนองตามสัญญา รหัสตอบกลับ http นอกเหนือจาก 2xx จะทำให้สัญญาถูกปฏิเสธ สามารถเขียนทับได้โดยการตั้งค่า options.simple = false
var options = {
method: 'POST',
uri: 'http://api.posttestserver.com/post',
body: {
some: 'payload'
},
json: true // Automatically stringifies the body to JSON
};
rp(options)
.then(function (parsedBody) {
// POST succeeded...
})
.catch(function (err) {
// POST failed...
});