Rumah >hujung hadapan web >tutorial js >Tutorial asas tentang cara menggunakan modul Permintaan dalam Node.js untuk mengendalikan requests_node.js protokol HTTP
Di sini kami memperkenalkan modul Node.js - permintaan. Dengan modul ini, permintaan http menjadi sangat mudah.
Permintaan sangat mudah untuk digunakan dan menyokong https dan ubah hala.
var request = require('request'); request('http://www.google.com', function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body) // 打印google首页 } })
Strim:
Sebarang respons boleh dikeluarkan kepada aliran fail.
request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))
Sebaliknya, anda juga boleh menghantar fail ke permintaan PUT atau POST. Jika tiada pengepala disediakan, sambungan fail akan dikesan dan jenis kandungan yang sepadan akan ditetapkan dalam permintaan PUT.
fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))
Permintaan juga boleh disalurkan kepada diri sendiri. Dalam kes ini, jenis kandungan asal dan panjang kandungan akan dikekalkan.
request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))
Borang:
permintaan menyokong aplikasi/x-www-form-urlencoded dan multipart/form-data untuk melaksanakan muat naik borang.
x-www-form-urlencoded adalah mudah:
request.post('http://service.com/upload', {form:{key:'value'}})
atau:
request.post('http://service.com/upload').form({key:'value'})
Gunakan data berbilang bahagian/borang dan anda tidak perlu risau tentang perkara remeh seperti menetapkan permintaan akan membantu anda menyelesaikannya.
var r = request.post('http://service.com/upload') var form = r.form() form.append('my_field', 'my_value') form.append('my_buffer', new Buffer([1, 2, 3])) form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png')) form.append('remote_file', request('http://google.com/doodle.png'))
Pengesahan HTTP:
request.get('http://some.server.com/').auth('username', 'password', false);
atau
request.get('http://some.server.com/', { 'auth': { 'user': 'username', 'pass': 'password', 'sendImmediately': false } });
sendImmediately, lalai kepada true, menghantar pengepala pengesahan asas. Selepas menetapkannya kepada palsu, ia akan mencuba semula apabila menerima 401 (tindak balas 401 pelayan mesti termasuk kaedah pengesahan yang ditentukan WWW-Authenticate).
Pengesahan digest disokong apabila sendImmediately adalah benar.
Log masuk OAuth:
// Twitter OAuth var qs = require('querystring') , oauth = { callback: 'http://mysite.com/callback/' , consumer_key: CONSUMER_KEY , consumer_secret: CONSUMER_SECRET } , url = 'https://api.twitter.com/oauth/request_token' ; request.post({url:url, oauth:oauth}, function (e, r, body) { // Ideally, you would take the body in the response // and construct a URL that a user clicks on (like a sign in button). // The verifier is only available in the response after a user has // verified with twitter that they are authorizing your app. var access_token = qs.parse(body) , oauth = { consumer_key: CONSUMER_KEY , consumer_secret: CONSUMER_SECRET , token: access_token.oauth_token , verifier: access_token.oauth_verifier } , url = 'https://api.twitter.com/oauth/access_token' ; request.post({url:url, oauth:oauth}, function (e, r, body) { var perm_token = qs.parse(body) , oauth = { consumer_key: CONSUMER_KEY , consumer_secret: CONSUMER_SECRET , token: perm_token.oauth_token , token_secret: perm_token.oauth_token_secret } , url = 'https://api.twitter.com/1/users/show.json?' , params = { screen_name: perm_token.screen_name , user_id: perm_token.user_id } ; url += qs.stringify(params) request.get({url:url, oauth:oauth, json:true}, function (e, r, user) { console.log(user) }) }) })
Pengepala HTTP tersuai
Ejen Pengguna dan seumpamanya boleh ditetapkan dalam objek pilihan. Dalam contoh berikut, kami memanggil API github untuk mengetahui nombor koleksi dan nombor terbitan gudang tertentu. Kami menggunakan Ejen Pengguna dan https yang disesuaikan.
var request = require('request'); var options = { url: 'https://api.github.com/repos/mikeal/request', headers: { 'User-Agent': 'request' } }; function callback(error, response, body) { if (!error && response.statusCode == 200) { var info = JSON.parse(body); console.log(info.stargazers_count +"Stars"); console.log(info.forks_count +"Forks"); } } request(options, callback);
kuki:
Secara lalai, kuki dilumpuhkan. Tetapkan balang kepada benar dalam lalai atau pilihan supaya permintaan seterusnya akan menggunakan kuki.
var request = request.defaults({jar: true}) request('http://www.google.com', function () { request('http://images.google.com') })
Dengan mencipta contoh baharu request.jar(), anda boleh menggunakan kuki tersuai dan bukannya balang kuki global permintaan.
var j = request.jar() var request = request.defaults({jar:j}) request('http://www.google.com', function () { request('http://images.google.com') })
atau
var j = request.jar() var cookie = request.cookie('your_cookie_here') j.setCookie(cookie, uri, function (err, cookie){}) request({url: 'http://www.google.com', jar: j}, function () { request('http://images.google.com') })
Perhatikan bahawa setCookie memerlukan sekurang-kurangnya tiga parameter, yang terakhir ialah fungsi panggil balik.
Anda boleh menggunakan kaedah paip permintaan untuk mendapatkan aliran fail imej dengan mudah
var request = require('request'), fs = require('fs'); request('https://www.google.com.hk/images/srpr/logo3w.png').pipe(fs.createWriteStream('doodle.png'));
Untuk lebih banyak kaedah dan arahan penggunaan, sila klik di sini untuk meneruskan bacaan: https://github.com/mikeal/request/
Contoh
Berikut ialah contoh yang sangat mudah untuk mendapatkan data pertanyaan hotel daripada Qunar.com (dapatkan kedudukan harga bagi setiap jenis bilik di hotel dalam tempoh masa tertentu):
var request = require('request'), fs = require('fs'); var reqUrl = 'http://hotel.qunar.com/price/detail.jsp?fromDate=2012-08-18&toDate=2012-08-19&cityurl=shanghai_city&HotelSEQ=shanghai_city_2856&cn=5'; request({uri:reqUrl}, function(err, response, body) { //console.log(response.statusCode); //console.log(response); //如果数据量比较大,就需要对返回的数据根据日期、酒店ID进行存储,如果获取数据进行对比的时候直接读文件 var filePath = __dirname + '/data/data.js'; if (fs.exists(filePath)) { fs.unlinkSync(filePath); console.log('Del file ' + filePath); } fs.writeFile(filePath, body, 'utf8', function(err) { if (err) { throw err; } console.log('Save ' + filePath + ' ok~'); }); console.log('Fetch ' + reqUrl + ' ok~'); });
Contoh ini datang daripada rakan yang menjalankan perniagaan hotel dan ingin mengetahui daya saing harga yang ditawarkannya kepada pelanggan di tapak webnya:
1. Jika harga yang diberikan terlalu rendah, anda akan mendapat lebih sedikit wang, jadi jika harga anda adalah yang terendah, anda perlu melihat apakah harga kedua terendah, dan kemudian memutuskan sama ada untuk melaraskan;
2. Jika harga yang diberikan terlalu tinggi, keputusan ranking akan lebih rendah, dan tiada pelanggan untuk menempah hotel, dan perniagaan akan hilang
Disebabkan kami banyak menjalankan perniagaan tempahan hotel, contohnya lebih 2,000 hotel, kalau bergantung pada semakan manual ranking satu persatu, ia akan menjadi lebih pasif, dan sukar untuk dikembangkan lagi, jadi saya menganalisis keperluannya dan ia boleh dilaksanakan, dan Ia boleh dijadikan sistem amaran masa nyata yang baik (sudah tentu data akan dimuat semula secara automatik pada halaman setiap 5 hingga 10 minit). Hanya dengan cara ini keuntungan boleh dimaksimumkan, kecekapan kerja bahagian jualan dan pelanggan dapat dipertingkatkan, dan bilangan kerjasama hotel dan pengembangan kakitangan syarikat dapat dipercepatkan:
1. Jika anda tidak kehilangan wang, jangan buat transaksi yang merugikan
2. Jika anda mendapati harga yang diberikan terlalu rendah atau terlalu tinggi, anda perlu menyokong panggilan antara muka API platform untuk mengubah suai harga secara langsung;
3. Ia mempunyai fungsi menjana laporan analisis secara automatik untuk menganalisis perubahan dalam strategi pelarasan harga pesaing