forked from uciharis/dicoding-JS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path16f-bodyrequest.js
executable file
·134 lines (113 loc) · 4.87 KB
/
16f-bodyrequest.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/** -- body request--
*
* ketika client melakukan permintaan dengan metode POST dan PUT, biasanya permintaan tsb
* memiliki sebuah data yang disimpan pada body request.
* data pada body bisa berupa format teks, JSON, berkas gambar atau format lain.
* data tsb nantinya akan digunakan oleh server utk diproses di database atau disimpan dalam bentuk objek utuh
*
* ketahuilah bahwa http.clientRequest merupakan turunan dari readable stream yang utk mendapatkan data body
* akan sedikit sulit dibandingkan dengan mendapatkan data header
* data di body didapatkan dengan teknik stream, seperti yang sudah kita ketahui, teknik ini memanfaatkan EventEmmiter utk mengirimkan bagian-bagian datanya
* dalam kasus http.clientRequest event data dan end lah yang digunakan untuk mendapatkan data body.
*
* berikut adlah contoh bagaimana mendapatkann data body:
*
* -- ini kode
*
* const requestListener = (request, response)=>{
* let body = [];
* request.on('data', (chunk)=> {
* body.push(chunk);
* });
* request.on('end', ()=>{
* body = Buffer.concat(body).toString();
* });
* };
*
* penjelasan kodenya sbb:
*
* 1. kita deklare var body dan isi nilai dg array kosong utk nampung buffer pada stream
* 2. ketika event data terjadi pada request, kita isi array body dg chunk yg dibawa callback func pada event tsb
* 3. ketika proses stream berakhir, event end akan dibangkitkan, disinilah kita ubah var body yg sblmnya
* menampung buffer menjadi data sebenarnya dalam bentuk string melalui perintah Buffer.concat(body).toString()
*/
// latihan mendapatkan body request
// kita akan mendapatkan data body request ketika client mengirim request dg methode POST
// buatlah web server merespon permintaan method POST dengan menampilkan sapaan dan nama berdasarkan data body yang dikirim oleh client
// bila client mengirimkan nama "dicoding", maka respon akan menampilkan "halo dicoding"
// client akan mengirimkan data nama tsb menggunakan format JSON
// {"name": "dicoding"}
// namun sebelum itu agar latihan lebih fokus terhadap bagaimana mendapatkan data pada body,
// kita hapus logika metod yang sebenarnya sebelum kita butuhkan seperti PUT DELETE.
// masuk pada projek nodejs-web-server lalu isikan berikut ke server.js
/**-- ini kode
*
* const http = require('http');
const requestListener = (request, response) => {
response.setHeader('Content-Type', 'text/html');
response.statusCode = 200;
const { method } = request;
if(method === 'GET') {
response.end('<h1>Hello!</h1>');
}
if(method === 'POST') {
let body=[];
request.on('data', (chunck)=>{
body.push(chunk);
});
request.on('end',()=>{
body=Buffer.concat(body).toString();
response.end(`<h1>Hai ${body}!</h1>`);
}
};
const server = http.createServer(requestListener);
const port = 5000;
const host = 'localhost';
server.listen(port, host, () => {
console.log(`Server berjalan pada http://${host}:${port}`);
});
*
*/
// perhatikan kode diatas. kita memindahkan proses respons di dalam callback event end
// hal ini diperlukan karena data body siap dikonsumsi hanya ketika event end telah dibangkitkan.
// dalam arti lain, server tidak akan mengirimkan respon apabila proses stream belum selesai
// simpan perubahan pada berkas server.js, jalankan ulang server dengan perintah npm run start
// lalukan permintaan ke server dengan menggunakan metod POST melalui cURL sperti ini:
// curl -X POST -H "Content-Type:application/json" http://localhost:5000 -d "{\"name\":\"dicoding\"}"
// server akan merespon dg :
//<h1>hai, {"name":"dicoding"!}</h1>
// ini masih bukan hasil yang kita harapkan. body masih bernilai data string JSON
// data ini perlu kita olah lagi agar mendapatkan nilai name yang sebenarnya.
// gunakan JSON.parse() untuk mengubah JSON string menjadi javascript objek.
// sesuaikan kembali kode pada blok POST menjadi seperti ini
/**
* const http = require('http');
const requestListener = (request, response) => {
response.setHeader('Content-Type', 'text/html');
response.statusCode = 200;
const { method } = request;
if(method === 'GET') {
response.end('<h1>Hello!</h1>');
}
if(method === 'POST') {
let body=[];
request.on('data', (chunck)=>{
body.push(chunk);
});
request.on('end',()=>{
body=Buffer.concat(body).toString();
const {name}= JSON.parse(body)
response.end(`<h1>Hai ${name}!</h1>`);
}
};
const server = http.createServer(requestListener);
const port = 5000;
const host = 'localhost';
server.listen(port, host, () => {
console.log(`Server berjalan pada http://${host}:${port}`);
});
*/
// simpan kembali lalu jalankan ulang npm run start
// lalukan request POST lagi
// curl -X POST -H "Content-Type: application/json" http://localhost:5000 -d "{\"name\": \"Dicoding\"}"
// output : <h1>hai, dicoding!</h1>