Thứ tư, 07/10/2020 | 00:00 GMT+7

Cách tạo một HTTP Client với Core HTTP trong Node.js

Ứng dụng web hiện đại giao tiếp với các server khác để hoàn thành một nhiệm vụ là điều bình thường. Ví dụ: ứng dụng web cho phép bạn mua sách trực tuyến có thể liên quan đến giao tiếp giữa server đặt hàng của khách hàng, server kiểm kê sách và server thanh toán. Trong thiết kế này, các dịch vụ khác nhau giao tiếp thông qua các API web — các định dạng tiêu chuẩn cho phép bạn gửi và nhận dữ liệu theo chương trình. Trong ứng dụng Node.js , bạn có thể giao tiếp với các API web bằng cách thực hiện các yêu cầu HTTP.

Node.js đi kèm với một mô-đun http và một https . Các module này có chức năng tạo server HTTP để chương trình Node.js có thể phản hồi các yêu cầu HTTP. Họ cũng có thể thực hiện các yêu cầu HTTP đến các server khác. Chức năng chính này trang bị cho các lập trình viên Node.js để tạo các ứng dụng web hiện đại, chạy trên nền tảng API với Node.js. Vì nó là một module cốt lõi, bạn không cần cài đặt bất kỳ thư viện nào để sử dụng nó.

Trong hướng dẫn này, bạn sẽ sử dụng module https để thực hiện các yêu cầu HTTP tới JSON Placeholder , một API REST giả cho mục đích thử nghiệm. Bạn sẽ bắt đầu bằng cách thực hiện một yêu cầu GET , một yêu cầu HTTP tiêu chuẩn để nhận dữ liệu. Sau đó, bạn sẽ xem xét các cách để tùy chỉnh yêu cầu của bạn , chẳng hạn như bằng cách thêm tiêu đề. Cuối cùng, bạn sẽ thực hiện các yêu cầu POST , PUTDELETE để bạn có thể sửa đổi dữ liệu trong một server bên ngoài.

Yêu cầu

  • Hướng dẫn này yêu cầu bạn phải cài đặt Node.js. Sau khi cài đặt, bạn có thể truy cập module https được sử dụng trong suốt hướng dẫn. Hướng dẫn này sử dụng Node.js version 10.19.0. Để cài đặt Node.js trên macOS hoặc Ubuntu 18.04, hãy làm theo các bước trong Cách cài đặt Node.js và Tạo môi trường phát triển local trên macOS hoặc phần Cài đặt bằng PPA của Cách cài đặt Node.js trên Ubuntu 18.04 .

  • Các phương thức được sử dụng để gửi yêu cầu HTTP có API dựa trên stream . Trong Node.js, các stream là các thể hiện của bộ phát sự kiện. Cách bạn phản hồi dữ liệu đến từ stream cũng giống như cách bạn phản hồi dữ liệu từ các sự kiện. Nếu bạn tò mò, bạn có thể có thêm kiến thức chuyên sâu về bộ phát sự kiện bằng cách đọc hướng dẫn Sử dụng bộ phát sự kiện trong Node.js của ta .

Bước 1 - Đưa ra yêu cầu GET

Khi bạn tương tác với một API, bạn thường thực hiện các yêu cầu GET để truy xuất dữ liệu từ web server . Trong bước này, bạn sẽ xem xét hai hàm để thực hiện các yêu cầu GET trong Node.js. Mã của bạn sẽ truy xuất một mảng JSON gồm profile user từ một API có thể truy cập .

Mô-đun https có hai hàm để thực hiện các yêu cầu GET — hàm get() , chỉ có thể thực hiện các yêu cầu GET và hàm request() , thực hiện các loại yêu cầu khác. Bạn sẽ bắt đầu bằng cách đưa ra một yêu cầu với hàm get() .

Đưa ra yêu cầu với get()

Các yêu cầu HTTP sử dụng hàm get() có định dạng sau:

https.get(URL_String, Callback_Function) {     Action } 

Đối số đầu tiên là một chuỗi có điểm cuối mà bạn đang thực hiện yêu cầu. Đối số thứ hai là một hàm gọi lại , mà bạn sử dụng để xử lý phản hồi.

Đầu tiên, hãy cài đặt môi trường mã hóa của bạn. Trong terminal của bạn, hãy tạo một folder để lưu trữ tất cả các module Node.js của bạn cho hướng dẫn này:

  • mkdir requests

Nhập folder đó:

  • cd requests

Tạo và mở một file mới trong editor . Hướng dẫn này sẽ sử dụng nano vì nó có sẵn trong terminal :

  • nano getRequestWithGet.js

Để thực hiện các yêu cầu HTTP trong Node.js, hãy nhập module https bằng cách thêm dòng sau:

request / getRequestWithGet.js
const https = require('https'); 

Lưu ý:: Node.js có module httphttps . Chúng có các chức năng giống nhau và hoạt động theo cách tương tự, nhưng https thực hiện các yêu cầu thông qua Bảo mật tầng truyền tải (TLS / SSL) . Vì các web server bạn đang sử dụng khả dụng qua HTTPS, bạn sẽ sử dụng module https . Nếu bạn đang thực hiện các yêu cầu đến và đi từ các URL chỉ có HTTP, thì bạn sẽ sử dụng module http .

Bây giờ, hãy sử dụng đối tượng http để thực hiện một yêu cầu GET tới API để truy xuất danh sách user . Bạn sẽ sử dụng Trình giữ chỗ JSON , một API có sẵn công khai để thử nghiệm. API này không lưu giữ bất kỳ thay đổi nào bạn thực hiện trong các yêu cầu của bạn . Nó mô phỏng một server thực và trả về các phản hồi bị chế nhạo miễn là bạn gửi một yêu cầu hợp lệ.

Viết mã được đánh dấu sau trong editor của bạn:

request / getRequestWithGet.js
const https = require('https');  let request = https.get('https://jsonplaceholder.typicode.com/users?_limit=2', (res) => { }); 

Như đã đề cập trong phần chữ ký hàm, hàm get() nhận hai tham số. Đầu tiên là URL API mà bạn đang thực hiện yêu cầu ở định dạng chuỗi và thứ hai là lệnh gọi lại để xử lý phản hồi HTTP. Để đọc dữ liệu từ phản hồi của bạn, bạn phải thêm một số mã trong lệnh gọi lại.

Phản hồi HTTP đi kèm với mã trạng thái. Mã trạng thái là một số cho biết mức độ thành công của phản hồi. Mã trạng thái từ 200 đến 299 là phản hồi tích cực, trong khi mã từ 400 đến 599 là lỗi. Bạn có thể tìm hiểu thêm về mã trạng thái trong hướng dẫn Cách khắc phục sự cố Mã lỗi HTTP phổ biến của ta .

Đối với yêu cầu này, phản hồi thành công sẽ có mã trạng thái 200. Điều đầu tiên bạn sẽ làm trong cuộc gọi lại của bạn sẽ là xác minh mã trạng thái là những gì bạn mong đợi. Thêm mã sau vào hàm gọi lại:

request / getRequestWithGet.js
const https = require('https');  let request = https.get('https://jsonplaceholder.typicode.com/users?_limit=2', (res) => {   if (res.statusCode !== 200) {     console.error(`Did not get an OK from the server. Code: ${res.statusCode}`);     res.resume();     return;   } }); 

Các đối tượng phản ứng đó là có sẵn trong callback có statusCode tài sản đó lưu trữ các mã trạng thái. Nếu mã trạng thái không phải là 200, bạn ghi lỗi vào console và thoát.

Lưu ý dòng có res.resume() . Bạn đã bao gồm dòng đó để cải thiện hiệu suất. Khi thực hiện các yêu cầu HTTP, Node.js sẽ sử dụng tất cả dữ liệu được gửi cùng với yêu cầu. Phương thức res.resume() yêu cầu Node.js bỏ qua dữ liệu của stream . Đổi lại, Node.js thường sẽ loại bỏ dữ liệu nhanh hơn so với nếu nó để nó để thu gom rác — một quá trình định kỳ giúp giải phóng bộ nhớ của ứng dụng.

Đến đây bạn đã nắm bắt được các phản hồi lỗi, hãy thêm mã để đọc dữ liệu. Các phản hồi của Node.js truyền dữ liệu của họ theo từng phần. Chiến lược để truy xuất dữ liệu sẽ là lắng nghe khi nào dữ liệu đến từ phản hồi, đối chiếu tất cả các phần và sau đó phân tích cú pháp JSON để ứng dụng của bạn có thể sử dụng nó.

Sửa đổi yêu cầu gọi lại để bao gồm mã này:

request / getRequestWithGet.js
const https = require('https');  let request = https.get('https://jsonplaceholder.typicode.com/users?_limit=2', (res) => {   if (res.statusCode !== 200) {     console.error(`Did not get an OK from the server. Code: ${res.statusCode}`);     res.resume();     return;   }    let data = '';    res.on('data', (chunk) => {     data += chunk;   });    res.on('close', () => {     console.log('Retrieved all data');     console.log(JSON.parse(data));   }); }); 

Bạn bắt đầu bằng cách tạo một data biến mới là một chuỗi rỗng. Bạn có thể lưu trữ dữ liệu dưới dạng một mảng số đại diện cho dữ liệu byte hoặc một chuỗi. Hướng dẫn này sử dụng cái sau vì việc chuyển đổi chuỗi JSON thành một đối tượng JavaScript dễ dàng hơn.

Sau khi tạo biến data , bạn tạo một trình nghe sự kiện . Node.js truyền dữ liệu của một phản hồi HTTP theo từng phần. Do đó, khi đối tượng phản hồi phát ra một sự kiện data , bạn sẽ lấy dữ liệu mà nó nhận được và thêm nó vào biến data của bạn.

Khi tất cả dữ liệu từ server được nhận, Node.js sẽ phát ra một sự kiện close . Đến đây, bạn phân tích cú pháp chuỗi JSON được lưu trữ trong data và ghi kết quả vào console .

Mô-đun Node.js của bạn hiện có thể giao tiếp với API JSON và ghi lại danh sách user , đây sẽ là một mảng JSON gồm ba user . Tuy nhiên, có một cải tiến nhỏ mà bạn có thể thực hiện trước.

Tập lệnh này sẽ báo lỗi nếu bạn không thể đưa ra yêu cầu. Ví dụ: bạn có thể không thực hiện được yêu cầu nếu bạn bị mất kết nối internet. Thêm mã sau để ghi lại lỗi khi bạn không thể gửi yêu cầu HTTP:

request / getRequestWithGet.js
...   res.on('data', (chunk) => {     data += chunk;   });    res.on('close', () => {     console.log('Retrieved all data');     console.log(JSON.parse(data));   });  });  request.on('error', (err) => {   console.error(`Encountered an error trying to make a request: ${err.message}`); }); 

Khi một yêu cầu được thực hiện nhưng không thể được gửi đi, đối tượng yêu cầu sẽ phát ra một sự kiện error . Nếu một sự kiện error được phát ra nhưng không được lắng nghe, chương trình Node.js sẽ bị treo. Do đó, để bắt lỗi, bạn thêm một trình xử lý sự kiện với hàm on() và lắng nghe các sự kiện error . Khi bạn gặp lỗi, bạn ghi lại thông báo của nó.

Đó là tất cả mã cho file này. Lưu và thoát nano bằng cách nhấn CTRL+X

Bây giờ thực thi chương trình này với node :

  • node getRequestWithGet.js

Control panel của bạn sẽ hiển thị phản hồi này:

Output
Retrieved all data [ { id: 1, name: 'Leanne Graham', username: 'Bret', email: 'Sincere@april.biz', address: { street: 'Kulas Light', suite: 'Apt. 556', city: 'Gwenborough', zipcode: '92998-3874', geo: [Object] }, phone: '1-770-736-8031 x56442', website: 'hildegard.org', company: { name: 'Romaguera-Crona', catchPhrase: 'Multi-layered client-server neural-net', bs: 'harness real-time e-markets' } }, { id: 2, name: 'Ervin Howell', username: 'Antonette', email: 'Shanna@melissa.tv', address: { street: 'Victor Plains', suite: 'Suite 879', city: 'Wisokyburgh', zipcode: '90566-7771', geo: [Object] }, phone: '010-692-6593 x09125', website: 'anastasia.net', company: { name: 'Deckow-Crist', catchPhrase: 'Proactive didactic contingency', bs: 'synergize scalable supply-chains' } } ]

Điều này nghĩa là bạn đã thực hiện thành công yêu cầu GET với thư viện Node.js cốt lõi.

Phương get() bạn đã sử dụng là một phương thức thuận tiện mà Node.js cung cấp vì các yêu cầu GET là một loại yêu cầu rất phổ biến. Node.js cung cấp phương thức request() để thực hiện bất kỳ loại yêu cầu nào. Tiếp theo, hướng dẫn này sẽ xem xét cách thực hiện một yêu cầu GET với request() .

Đưa ra yêu cầu với request()

Phương thức request() hỗ trợ nhiều chữ ký hàm. Bạn sẽ sử dụng cái này cho ví dụ tiếp theo:

https.request(URL_String, Options_Object, Callback_Function) {     Action } 

Đối số đầu tiên là một chuỗi với điểm cuối API. Đối số thứ hai là một đối tượng JavaScript chứa tất cả các tùy chọn cho yêu cầu. Đối số cuối cùng là một hàm gọi lại để xử lý phản hồi.

Tạo file mới cho module mới có tên getRequestWithRequest.js :

  • nano getRequestWithRequest.js

Mã bạn sẽ viết tương tự như module getRequestWithGet.js bạn đã viết trước đó. Đầu tiên, nhập module https :

request / getRequestWithRequest.js
const https = require('https'); 

Tiếp theo, tạo một đối tượng JavaScript mới có chứa khóa method :

request / getRequestWithRequest.js
const https = require('https');  const options = {   method: 'GET' }; 

Khóa method trong đối tượng này sẽ cho hàm request() biết phương thức HTTP mà yêu cầu đang sử dụng.

Tiếp theo, thực hiện yêu cầu trong mã của bạn. Đoạn mã sau làm nổi bật mã khác với yêu cầu được thực hiện với phương thức get() . Trong editor , hãy nhập tất cả các dòng sau:

request / getRequestWithRequest.js
...  let request = https.request('https://jsonplaceholder.typicode.com/users?_limit=2', options, (res) => {   if (res.statusCode !== 200) {     console.error(`Did not get an OK from the server. Code: ${res.statusCode}`);     res.resume();     return;   }    let data = '';    res.on('data', (chunk) => {     data += chunk;   });    res.on('close', () => {     console.log('Retrieved all data');     console.log(JSON.parse(data));   }); });  request.end();  request.on('error', (err) => {   console.error(`Encountered an error trying to make a request: ${err.message}`); }); 

Để thực hiện một yêu cầu bằng request() , bạn cung cấp URL trong đối số đầu tiên, một đối tượng với các tùy chọn HTTP trong đối số thứ hai và một lệnh gọi lại để xử lý phản hồi trong đối số thứ ba.

Biến options bạn đã tạo trước đó là đối số thứ hai, nói với Node.js rằng đây là một yêu cầu GET . Lệnh gọi lại không thay đổi so với lần đầu tiên bạn viết.

Bạn cũng gọi phương thức end() của biến request . Đây là một phương thức quan trọng phải được gọi khi sử dụng hàm request() . Nó hoàn thành yêu cầu, cho phép nó được gửi đi. Nếu bạn không gọi nó, chương trình sẽ không bao giờ hoàn thành, vì Node.js sẽ nghĩ rằng bạn vẫn còn dữ liệu để thêm vào yêu cầu.

Lưu và thoát nano bằng CTRL+X hoặc tương đương với editor của bạn.

Chạy chương trình này trong terminal của bạn:

  • node getRequestWithRequest.js

Bạn sẽ nhận được kết quả này, giống như module đầu tiên:

Output
Retrieved all data [ { id: 1, name: 'Leanne Graham', username: 'Bret', email: 'Sincere@april.biz', address: { street: 'Kulas Light', suite: 'Apt. 556', city: 'Gwenborough', zipcode: '92998-3874', geo: [Object] }, phone: '1-770-736-8031 x56442', website: 'hildegard.org', company: { name: 'Romaguera-Crona', catchPhrase: 'Multi-layered client-server neural-net', bs: 'harness real-time e-markets' } }, { id: 2, name: 'Ervin Howell', username: 'Antonette', email: 'Shanna@melissa.tv', address: { street: 'Victor Plains', suite: 'Suite 879', city: 'Wisokyburgh', zipcode: '90566-7771', geo: [Object] }, phone: '010-692-6593 x09125', website: 'anastasia.net', company: { name: 'Deckow-Crist', catchPhrase: 'Proactive didactic contingency', bs: 'synergize scalable supply-chains' } } ]

Đến đây bạn đã sử dụng phương thức request() để thực hiện yêu cầu GET . Điều quan trọng là phải biết chức năng này vì nó cho phép bạn tùy chỉnh yêu cầu của bạn theo những cách mà phương thức get() không thể, như thực hiện yêu cầu với các phương thức HTTP khác.

Tiếp theo, bạn sẽ cấu hình và tùy chỉnh các yêu cầu của bạn với hàm request() .

Bước 2 - Tùy chọn cấu hình request() HTTP request()

Hàm request() cho phép bạn gửi các yêu cầu HTTP mà không cần chỉ định URL trong đối số đầu tiên. Trong trường hợp này, URL sẽ được chứa với đối tượng optionsrequest() sẽ có chữ ký hàm này:

https.request(Options_Object, Callback_Function) {     Action } 

Trong bước này, bạn sẽ sử dụng chức năng này để cấu hình request() của bạn request() với đối tượng options .

Node.js cho phép bạn nhập URL vào đối tượng options mà bạn chuyển cho yêu cầu. Để thử điều này, hãy mở lại file getRequestWithRequest.js :

  • nano getRequestWithRequest.js

Xóa URL khỏi lệnh gọi request() để các đối số duy nhất là biến options và hàm gọi lại:

request / getRequestWithRequest.js
const https = require('https');  const options = {   method: 'GET', };  let request = https.request(options, (res) => { ... 

Bây giờ hãy thêm các thuộc tính sau vào đối tượng options :

request / getRequestWithRequest.js
const https = require('https');  const options = {   host: 'jsonplaceholder.typicode.com',   path: '/users?_limit=2',   method: 'GET' };  let request = https.request(options, (res) => { ... 

Thay vì một URL chuỗi, bạn có hai thuộc tính— hostpath . Máy host là domain hoặc địa chỉ IP của server bạn đang truy cập. Đường dẫn là mọi thứ xuất hiện sau domain , bao gồm các tham số truy vấn (giá trị sau dấu chấm hỏi).

Đối tượng tùy chọn có thể chứa dữ liệu hữu ích khác đi vào yêu cầu. Ví dụ: bạn có thể cung cấp tiêu đề yêu cầu trong các tùy chọn. Tiêu đề thường gửi metadata về yêu cầu.

Khi các nhà phát triển tạo API, họ có thể chọn hỗ trợ các định dạng dữ liệu khác nhau. Một điểm cuối API có thể trả về dữ liệu trong JSON, CSV hoặc XML . Trong các API đó, server có thể xem xét tiêu đề Accept để xác định loại phản hồi chính xác.

Tiêu đề Accept chỉ định loại dữ liệu mà user có thể xử lý. Mặc dù API được sử dụng trong các ví dụ này chỉ trả về JSON, nhưng bạn có thể thêm tiêu đề Accept vào yêu cầu của bạn để tuyên bố rõ ràng rằng bạn muốn JSON.

Thêm các dòng mã sau để nối tiêu đề Accept :

request / getRequestWithRequest.js
const https = require('https');  const options = {   host: 'jsonplaceholder.typicode.com',   path: '/users?_limit=2',   method: 'GET',   headers: {     'Accept': 'application/json'   } }; 

Bằng cách thêm tiêu đề, bạn đã bao gồm bốn tùy chọn phổ biến nhất được gửi trong các yêu cầu HTTP của Node.js: host , path , methodheaders . Node.js hỗ trợ nhiều tùy chọn hơn; bạn có thể đọc thêm tại tài liệu chính thức của Node.js để biết thêm thông tin.

Nhập CTRL+X để lưu file của bạn và thoát khỏi nano .

Tiếp theo, hãy chạy mã của bạn để thực hiện yêu cầu bằng cách chỉ sử dụng các tùy chọn:

  • node getRequestWithRequest.js

Kết quả sẽ giống như các lần chạy trước của bạn:

Output
Retrieved all data [ { id: 1, name: 'Leanne Graham', username: 'Bret', email: 'Sincere@april.biz', address: { street: 'Kulas Light', suite: 'Apt. 556', city: 'Gwenborough', zipcode: '92998-3874', geo: [Object] }, phone: '1-770-736-8031 x56442', website: 'hildegard.org', company: { name: 'Romaguera-Crona', catchPhrase: 'Multi-layered client-server neural-net', bs: 'harness real-time e-markets' } }, { id: 2, name: 'Ervin Howell', username: 'Antonette', email: 'Shanna@melissa.tv', address: { street: 'Victor Plains', suite: 'Suite 879', city: 'Wisokyburgh', zipcode: '90566-7771', geo: [Object] }, phone: '010-692-6593 x09125', website: 'anastasia.net', company: { name: 'Deckow-Crist', catchPhrase: 'Proactive didactic contingency', bs: 'synergize scalable supply-chains' } } ]

Vì các API có thể khác nhau giữa các nhà cung cấp, nên việc thoải mái với đối tượng options là key để thích ứng với các yêu cầu khác nhau của chúng, với các kiểu dữ liệu và tiêu đề là một số biến thể phổ biến nhất.

Lúc này, bạn chỉ thực hiện các yêu cầu GET để lấy dữ liệu. Tiếp theo, bạn sẽ thực hiện yêu cầu POST với Node.js để bạn có thể tải dữ liệu lên server .

Bước 3 - Đưa ra Yêu cầu POST

Khi bạn tải dữ liệu lên server hoặc muốn server tạo dữ liệu cho bạn, bạn thường gửi một yêu cầu POST . Trong phần này, bạn sẽ tạo một yêu cầu POST trong Node.js. Bạn sẽ yêu cầu tạo user mới trong API users .

Mặc dù là một phương thức khác với GET , bạn có thể sử dụng lại mã từ các yêu cầu trước đó khi viết yêu cầu POST của bạn . Tuy nhiên, bạn sẽ phải thực hiện các điều chỉnh sau:

  • Thay đổi phương thức trong đối tượng options thành POST
  • Thêm tiêu đề vào trạng thái bạn đang tải lên JSON
  • Kiểm tra mã trạng thái để xác nhận user đã được tạo
  • Tải lên dữ liệu của user mới

Để thực hiện những thay đổi này, trước tiên hãy tạo một file mới có tên là postRequest.js . Mở file này bằng nano hoặc một editor thay thế:

  • nano postRequest.js

Bắt đầu bằng lệnh module https và tạo một đối tượng options :

request / postRequest.js
const https = require('https');  const options = {   host: 'jsonplaceholder.typicode.com',   path: '/users',   method: 'POST',   headers: {     'Accept': 'application/json',     'Content-Type': 'application/json; charset=UTF-8'   } }; 

Bạn thay đổi path để phù hợp với những gì cần thiết cho các yêu cầu POST . Bạn cũng đã cập nhật method thành POST . Cuối cùng, bạn đã thêm một tiêu đề mới trong tùy chọn Content-Type . Tiêu đề này cho server biết loại dữ liệu bạn đang tải lên. Trong trường hợp này, bạn sẽ tải lên dữ liệu JSON với mã hóa UTF-8 .

Tiếp theo, thực hiện yêu cầu với hàm request() . Điều này tương tự như cách bạn thực hiện yêu cầu GET , nhưng bây giờ bạn tìm kiếm mã trạng thái khác với 200. Thêm các dòng sau vào cuối mã của bạn:

request / postRequest.js
... const request = https.request(options, (res) => {   if (res.statusCode !== 201) {     console.error(`Did not get a Created from the server. Code: ${res.statusCode}`);     res.resume();     return;   }    let data = '';    res.on('data', (chunk) => {     data += chunk;   });    res.on('close', () => {     console.log('Added new user');     console.log(JSON.parse(data));   }); }); 

Dòng mã được đánh dấu sẽ kiểm tra xem mã trạng thái có phải là 201 không. Mã trạng thái 201 được sử dụng để cho biết server đã tạo một tài nguyên.

Yêu cầu POST này nhằm mục đích tạo user mới. Đối với API này, bạn cần tải lên chi tiết user . Tạo một số dữ liệu user và gửi dữ liệu đó với yêu cầu POST của bạn:

request / postRequest.js
...  const requestData = {   name: 'New User',   username: 'digitalocean',   email: 'user@digitalocean.com',   address: {     street: 'North Pole',     city: 'Murmansk',     zipcode: '12345-6789',   },   phone: '555-1212',   website: 'digitalocean.com',   company: {     name: 'DigitalOcean',     catchPhrase: 'Welcome to the developer cloud',     bs: 'cloud scale security'   } };  request.write(JSON.stringify(requestData)); 

Đầu tiên, bạn đã tạo biến requestData , là một đối tượng JavaScript chứa dữ liệu user . Yêu cầu của bạn không bao gồm trường id , vì các server thường tạo các trường này trong khi lưu dữ liệu mới.

Tiếp theo, bạn sử dụng hàm request.write() , hàm này chấp nhận một chuỗi hoặc đối tượng đệm để gửi cùng với yêu cầu. Vì biến requestData của bạn là một đối tượng nên bạn đã sử dụng hàm JSON.stringify để chuyển đổi nó thành một chuỗi.

Để hoàn thành module này, hãy kết thúc yêu cầu và kiểm tra lỗi:

request / postRequest.js
...  request.end();  request.on('error', (err) => {   console.error(`Encountered an error trying to make a request: ${err.message}`); }); 

Điều quan trọng là bạn phải ghi dữ liệu trước khi sử dụng hàm end() . Hàm end() cho Node.js biết rằng không còn dữ liệu nào được thêm vào yêu cầu và gửi nó.

Lưu và thoát nano bằng cách nhấn CTRL+X

Chạy chương trình này để xác nhận user mới đã được tạo:

  • node postRequest.js

Kết quả sau sẽ được hiển thị:

Output
Added new user { name: 'New User', username: 'digitalocean', email: 'user@digitalocean.com', address: { street: 'North Pole', city: 'Murmansk', zipcode: '12345-6789' }, phone: '555-1212', website: 'digitalocean.com', company: { name: 'DigitalOcean', catchPhrase: 'Welcome to the developer cloud', bs: 'cloud scale security' }, id: 11 }

Đầu ra xác nhận yêu cầu đã thành công. API đã trả lại dữ liệu user đã được tải lên, cùng với ID được chỉ định cho nó.

Đến đây bạn đã học cách thực hiện yêu cầu POST , bạn có thể tải dữ liệu lên server trong Node.js. Tiếp theo, bạn sẽ thử các yêu cầu PUT , một phương pháp được sử dụng để cập nhật dữ liệu trong server .

Bước 4 - Đưa ra yêu cầu PUT

Các nhà phát triển đưa ra yêu cầu PUT để tải dữ liệu lên server . Mặc dù điều này có thể tương tự với các yêu cầu POST , nhưng các yêu cầu PUT có một chức năng khác. Yêu cầu PUTkhông quan trọng — bạn có thể chạy một yêu cầu PUT nhiều lần và nó sẽ có cùng kết quả.

Trên thực tế, mã bạn viết tương tự như mã của một yêu cầu POST . Bạn cài đặt các tùy chọn của bạn , đưa ra yêu cầu, viết dữ liệu bạn muốn tải lên và xác minh phản hồi.

Để thử điều này, bạn sẽ tạo một yêu cầu PUT cập nhật tên user đầu tiên của user .

Vì mã tương tự như yêu cầu POST , bạn sẽ sử dụng module đó làm cơ sở cho yêu cầu này. Sao chép postRequest.js vào một file mới, putRequest.js :

  • cp postRequest.js putRequest.js

Bây giờ hãy mở putRequest.js trong editor :

  • nano putRequest.js

áp dụng các thay đổi được đánh dấu này để bạn gửi yêu cầu PUT đến https://jsonplaceholder.typicode.com/users/1 :

request / putRequest.js
const https = require('https');  const options = {   host: 'jsonplaceholder.typicode.com',   path: '/users/1',   method: 'PUT',   headers: {     'Accept': 'application/json',     'Content-Type': 'application/json; charset=UTF-8'   } };  const request = https.request(options, (res) => {   if (res.statusCode !== 200) {     console.error(`Did not get an OK from the server. Code: ${res.statusCode}`);     res.resume();     return;   }    let data = '';    res.on('data', (chunk) => {     data += chunk;   });    res.on('close', () => {     console.log('Updated data');     console.log(JSON.parse(data));   }); });  const requestData = {   username: 'digitalocean' };  request.write(JSON.stringify(requestData));  request.end();  request.on('error', (err) => {   console.error(`Encountered an error trying to make a request: ${err.message}`); }); 

Đầu tiên bạn thay đổi thuộc tính pathmethod của đối tượng options . path trong trường hợp này xác định user mà bạn chuẩn bị cập nhật. Khi bạn đưa ra yêu cầu, bạn kiểm tra xem mã phản hồi có phải là 200 hay không, nghĩa là yêu cầu đó đã OK. Dữ liệu bạn đang tải lên bây giờ chỉ chứa thuộc tính bạn đang cập nhật.

Lưu và thoát nano bằng CTRL+X

Bây giờ thực thi chương trình Node.js này trong terminal :

  • node putRequest.js

Bạn sẽ nhận được kết quả này:

Output
Updated data { username: 'digitalocean', id: 1 }

Bạn đã gửi một yêu cầu PUT để cập nhật user đã có từ trước.

Lúc này, bạn đã học cách truy xuất, thêm và cập nhật dữ liệu. Để cung cấp cho ta toàn bộ lệnh quản lý dữ liệu qua API, tiếp theo, bạn sẽ thực hiện yêu cầu DELETE để xóa dữ liệu khỏi server .

Bước 5 - Đưa ra Yêu cầu DELETE

Yêu cầu DELETE được sử dụng để xóa dữ liệu khỏi server . Nó có thể có một phần thân yêu cầu, nhưng hầu hết các API có xu hướng không yêu cầu chúng. Phương pháp này được sử dụng để xóa toàn bộ một đối tượng khỏi server . Trong phần này, bạn sẽ xóa một user bằng API.

Mã bạn sẽ viết tương tự như mã của một yêu cầu GET , vì vậy hãy sử dụng module đó làm cơ sở cho mã này. Sao chép file getRequestWithRequest.js vào file deleteRequest.js mới:

  • cp getRequestWithRequest.js deleteRequest.js

Mở deleteRequest.js bằng nano :

  • nano deleteRequest.js

Bây giờ hãy sửa đổi mã tại các phần được đánh dấu để bạn có thể xóa user đầu tiên trong API:

request / putRequest.js
const https = require('https');  const options = {   host: 'jsonplaceholder.typicode.com',   path: '/users/1',   method: 'DELETE',   headers: {     'Accept': 'application/json',   } };  const request = https.request(options, (res) => {   if (res.statusCode !== 200) {     console.error(`Did not get an OK from the server. Code: ${res.statusCode}`);     res.resume();     return;   }    let data = '';    res.on('data', (chunk) => {     data += chunk;   });    res.on('close', () => {     console.log('Deleted user');     console.log(JSON.parse(data));   }); });  request.end();  request.on('error', (err) => {   console.error(`Encountered an error trying to make a request: ${err.message}`); }); 

Đối với module này, bạn bắt đầu bằng cách thay đổi thuộc tính path của đối tượng tùy chọn thành tài nguyên bạn muốn xóa — user đầu tiên. Sau đó, bạn thay đổi phương thức thành DELETE .

Lưu và thoát khỏi file này bằng cách nhấn CTRL+X

Chạy module này để xác nhận nó hoạt động. Nhập lệnh sau vào terminal của bạn:

  • node deleteRequest.js

Chương trình sẽ xuất ra:

Output
Deleted user {}

Mặc dù API không trả về nội dung phản hồi, nhưng bạn vẫn nhận được 200 phản hồi nên yêu cầu là OK.

Đến đây bạn đã học cách thực hiện các yêu cầu DELETE với các module cốt lõi của Node.js.

Kết luận

Trong hướng dẫn này, bạn đã thực hiện các yêu cầu GET , POST , PUTDELETE trong Node.js. Không có thư viện nào được cài đặt; những yêu cầu này được thực hiện bằng module https chuẩn. Trong khi các yêu cầu GET có thể được thực hiện bằng hàm get() , tất cả các phương thức HTTP khác được thực hiện thông qua phương thức request() .

Mã bạn đã viết được viết cho một API thử nghiệm, có sẵn công khai. Tuy nhiên, cách bạn viết yêu cầu sẽ hoạt động đối với tất cả các loại API. Nếu bạn muốn tìm hiểu thêm về API, hãy xem trang chủ đề API của ta . Để biết thêm về cách phát triển trong Node.js, hãy quay lại loạt bài Cách viết mã trong Node.js.


Tags:

Các tin liên quan