1. Analisis pembukaan
Pertama -tama, semua orang harus terbiasa dengan konsep "http". Ini tidak didasarkan pada bahasa tertentu, tetapi merupakan protokol lapisan aplikasi umum. Bahasa yang berbeda memiliki detail implementasi yang berbeda, tetapi mereka konsisten dengan prinsip -prinsipnya dan idenya sama.
Sebagai lingkungan yang menjalankan host, NodeJS menggunakan JavaScript sebagai bahasa host dan juga memiliki set standar sendiri yang diimplementasikan. Dalam artikel ini, mari kita pelajari tentang "modul http" bersama -sama. Tapi sebagai premis,
Saya harap Anda dapat membaca API yang disediakan oleh situs web resmi terlebih dahulu dan memiliki pemahaman awal, yang akan membuatnya jauh lebih nyaman. Berikut ini adalah gambaran umum API di bagian http:
Salinan kode adalah sebagai berikut:
Http
http.status_codes
http.createServer ([RequestListener])
http.createClient ([port], [host])
Kelas: http.server
Acara: 'Permintaan'
Acara: 'Koneksi'
Acara: 'Tutup'
Acara: 'CheckContinue'
Acara: 'Hubungkan'
Acara: 'Tingkatkan'
Acara: 'ClientError'
server.listen (port, [hostname], [backlog], [callback])
server.listen (path, [callback])
server.listen (handle, [callback])
server.close ([callback])
Server.Maxheaderscount
server.setTimeout (msecs, callback)
server.timeout
Kelas: http.serverresponse
Acara: 'Tutup'
response.writecontinue ()
response.writeHead (statuscode, [reasonphrase], [header])
response.setTimeout (msec, callback)
response.statuscode
response.setheader (nama, nilai)
respons.headssent
Response.Senddate
response.getheader (nama)
response.removeheader (nama)
response.write (chunk, [encoding])
response.addtrailers (header)
response.end ([data], [encoding])
http.request (opsi, callback)
http.get (opsi, panggilan balik)
Kelas: http.agent
agen baru ([opsi])
agen.maxsockets
agen.maxfreesockets
agen.sockets
agen.freesockets
Agen.RESTERS
agen.destroy ()
agent.getname (opsi)
http.globalagent
Kelas: http.clientRequest
'Respons' acara
Acara: 'Socket'
Acara: 'Hubungkan'
Acara: 'Tingkatkan'
Acara: 'Lanjutkan'
request.write (chunk, [encoding])
request.end ([data], [encoding])
request.abort ()
request.setTimeout (timeout, [callback])
request.setnodelay ([nodelay])
request.setsocketkeepalive ([Enable], [InitialDelay])
http.incomingmessage
Acara: 'Tutup'
pesan.httpversion
pesan. Headers
pesan.rawheaders
pesan.TRAILERS
pesan.rawtrailers
message.setTimeout (msecs, callback)
pesan.method
pesan.url
pesan.StatusCode
pesan.socket
Mari kita mulai dengan contoh sederhana, buat file yang disebut server.js, dan tulis kode berikut:
Salinan kode adalah sebagai berikut:
var http = membutuhkan ('http');
var server = http.createServer (function (req, res) {
res.writeHeader (200, {
'Tipe konten': 'teks/polos; charset = utf-8' // tambahkan charset = utf-8
});
res.end ("Halo, beruang besar!");
});
server.listen (8888);
Console.log ("Server HTTP berjalan di port 8888 ...");
(Node Server.js) Berikut ini adalah hasil yang sedang berjalan:
2. Contoh analisis terperinci
Mari kita lihat contoh kecil ini:
(Baris 1): Perkenalkan modul "http" yang dilengkapi dengan nodeJs melalui "membutuhkan" dan menetapkannya ke variabel http.
(2 baris): Panggil fungsi yang disediakan oleh modul HTTP: "CreateServer". Fungsi ini mengembalikan objek server web baru.
Parameter "RequestListener" adalah fungsi yang secara otomatis akan ditambahkan ke antrian mendengarkan acara "permintaan".
Ketika sebuah permintaan tiba, acara-loop akan menempatkan fungsi panggilan balik pendengar ke dalam antrian eksekusi, dan semua kode dalam node dieksekusi satu per satu dari antrian eksekusi.
Semua eksekusi ini ada di utas pekerja (loop acara itu sendiri dapat dianggap berada di utas independen. Kami umumnya tidak menyebutkan utas ini, tetapi panggilan node lingkungan eksekusi tunggal).
Semua panggilan balik dijalankan di utas pekerja.
Mari kita lihat fungsi callback "RequestListener", yang menyediakan dua parameter (permintaan, respons).
Dipicu setiap kali permintaan diterima. Perhatikan bahwa setiap koneksi mungkin memiliki banyak permintaan (dalam koneksi tetap-hidup).
"Permintaan" adalah contoh dari http.incomingmessage. "Respons" adalah contoh dari http.serverresponse.
Objek permintaan HTTP adalah aliran yang dapat dibaca, sedangkan objek respons HTTP adalah aliran yang dapat ditulis.
Objek "IncomingMessage" dibuat oleh http.server atau http.clientRequest.
Dan lulus sebagai parameter pertama untuk masing -masing acara "permintaan" dan "respons".
Ini juga dapat digunakan untuk mengakses status, file header, dan data respons.
Ini mengimplementasikan antarmuka "stream" serta peristiwa, metode, dan properti tambahan berikut. (Lihat API untuk detailnya).
(3 baris): "WriteHeader", gunakan fungsi "respons.writeHead ()" untuk mengirim status HTTP 200 dan tipe konten header HTTP (tipe konten).
Balas header permintaan. "StatusCode" adalah kode status HTTP tiga-bit, seperti 404. Parameter terakhir, "header", adalah konten header respons.
Ambil kastanye:
Salinan kode adalah sebagai berikut:
var body = 'hello world';
response.writeHead (200, {
'Content-length': body.length,
'Tipe konten': 'teks/polos'
});
Catatan: Panjang konten dihitung dalam byte, bukan dalam karakter.
Alasan untuk contoh sebelumnya adalah string "Hello World!" hanya berisi karakter byte tunggal.
Jika tubuh mengandung karakter multibyte-encoded, buffer.bytelength () harus digunakan untuk menentukan jumlah byte dari string dalam kasus pengkodean karakter multibyte.
Harus dijelaskan lebih lanjut bahwa Node tidak memeriksa apakah atribut lenth konten cocok dengan panjang tubuh yang ditransmisikan.
StatusCode adalah kode status HTTP tiga-bit, misalnya: "404". Yang ingin saya bicarakan di sini adalah "http.status_codes", semua set dan deskripsi pendek dari kode status respons "http" standar disertakan.
Berikut ini adalah referensi kode sumber:
Salinan kode adalah sebagai berikut:
var status_codes = exports.status_codes = {
100: 'Lanjutkan',
101: 'Protokol switching',
102: 'pemrosesan', // RFC 2518, terpilih oleh RFC 4918
200: 'Ok',
201: 'dibuat',
202: 'diterima',
203: 'Informasi non-otoritatif',
204: 'tidak ada konten',
205: 'Reset Konten',
206: 'konten parsial',
207: 'Multi-Status', // RFC 4918
300: 'banyak pilihan',
301: 'dipindahkan secara permanen',
302: 'dipindahkan sementara',
303: 'lihat yang lain',
304: 'tidak dimodifikasi',
305: 'Gunakan proxy',
307: 'pengalihan sementara',
400: 'Permintaan Buruk',
401: 'tidak sah',
402: 'Pembayaran Diperlukan',
403: 'dilarang',
404: 'tidak ditemukan',
405: 'Metode tidak diperbolehkan',
406: 'tidak dapat diterima',
407: 'otentikasi proxy diperlukan',
408: 'Minta waktu luang',
409: 'Konflik',
410: 'Gone',
411: 'panjang diperlukan',
412: 'Prasyarat gagal',
413: 'meminta entitas terlalu besar',
414: 'Permintaan-Uuri Terlalu Besar',
415: 'Tipe Media yang Tidak Didukung',
416: 'rentang yang diminta tidak memuaskan',
417: 'Harapan Gagal',
418: 'I/' Ma Teapot ', // RFC 2324
422: 'Entitas Tidak Dapat Memproses', // RFC 4918
423: 'terkunci', // RFC 4918
424: 'Gagal Ketergantungan', // RFC 4918
425: 'Koleksi Tidak Tertib', // RFC 4918
426: 'Diperlukan Upgrade', // RFC 2817
500: 'Kesalahan server internal',
501: 'tidak diimplementasikan',
502: 'Gateway Buruk',
503: 'Layanan tidak tersedia',
504: 'Gateway Time-Out',
505: 'Versi http tidak didukung',
506: 'Varian juga Negosiasi', // RFC 2295
507: 'Penyimpanan Tidak Cukup', // RFC 4918
509: 'batas bandwidth terlampaui',
510: 'tidak diperpanjang' // RFC 2774
};
Dikutip dari kode sumber nodeJS "http.js" dimulai dengan baris 143.
Bahkan, tidak sulit untuk melihat dari hasil respons klien:
(6 baris): "Response.end" ------ Ketika semua header dan pesan respons dikirim, metode ini mengirimkan sinyal ke server. Server akan berpikir bahwa pesan selesai.
Metode ini harus dipanggil setelah setiap respons selesai. Jika parameter "data" ditentukan, itu setara dengan memanggil "response.write (data, encoding)" pertama dan kemudian memanggil "response.end ()".
(8 baris): "Server.Listen (8888)" ----- Server menerima koneksi dengan pegangan yang ditentukan dan mengikat ke port tertentu.
Di atas adalah proses analisis yang lebih rinci, berharap dapat membantu memperdalam pemahaman. Meskipun tidak ada banyak kode, fokusnya adalah pada pemahaman beberapa mekanisme terperinci sehingga aplikasi NodeJS dapat dikembangkan secara efisien di masa depan.
Tiga, contoh
Selain menggunakan objek "Permintaan" untuk mengakses data header permintaan, objek "permintaan" juga dapat digunakan sebagai aliran data hanya baca untuk mengakses data Badan Permintaan.
Berikut adalah contoh permintaan "posting":
Salinan kode adalah sebagai berikut:
http.createServer (function (request, response) {
var body = [];
console.log (request.method);
console.log (request.headers);
request.on ('data', function (chunk) {
body.push (chunk);
});
request.on ('end', function () {
tubuh = buffer.concat (tubuh);
console.log (body.tostring ());
});
}). Dengarkan (8888);
Di bawah ini adalah konten data permintaan "http" lengkap.
Salinan kode adalah sebagai berikut:
POST/HTTP/1.1
Pengguna-agen: Curl/7.26.0
Host: Localhost
Menerima: */*
Panjang konten: 11
Tipe konten: Aplikasi/X-WWW-Form-Urlencoded
Halo dunia
Empat, mari kita ringkas
(1) Memahami konsep "http".
(2) Mahir dalam menggunakan API terkait "http".
(3) Perhatikan kontrol detail, seperti: detail pemrosesan antara "post, get".
(4), pemahaman "RequestListener".
(5), tekankan konsep: Objek permintaan HTTP adalah aliran yang dapat dibaca, sedangkan objek respons HTTP adalah aliran yang dapat ditulis.