Hướng dẫn API tìm nạp JavaScript: GET, POST, Xử lý lỗi và hết thời gian chờ
Tìm nạp là cách tích hợp sẵn để gọi API từ JavaScript, nhưng nó có một điều bất ngờ khiến hầu hết mọi người đều chú ý. Tìm hiểu cách gửi yêu cầu, xử lý mọi loại lỗi và xây dựng một công cụ trợ giúp nhỏ mà bạn có thể sử dụng lại.
fetch()trả lại lời hứa choResponsevà việc đọc nội dung mất một giâyawait.- Các lỗi HTTP như 404 và 500 không từ chối, vì vậy hãy luôn kiểm tra
response.ok. - Để gửi JSON, hãy sử dụng
JSON.stringifyvà đặt tiêu đềContent-Type. - Tìm nạp không có tùy chọn thời gian chờ mặc định, vì vậy hãy sử dụng
AbortSignal.timeout().
Hầu hết các ứng dụng web hiện đại đều liên tục giao tiếp với máy chủ. API tìm nạp JavaScript là cách tiêu chuẩn để thực hiện điều đó và được tích hợp vào trình duyệt cũng như Node.js 18 trở lên nên không cần phải cài đặt.
Việc sử dụng cơ bản cần hai dòng, tuy nhiên nhiều hướng dẫn chỉ dừng lại ở đó và bỏ qua phần gây ra lỗi thực sự: xử lý lỗi. Chúng tôi đã thử nghiệm các ví dụ trong hướng dẫn này trên một máy chủ cục bộ nhỏ trên Node.js 24 và kết quả hiển thị là từ lần chạy đó. example.com trong mã là viết tắt của API của riêng bạn. Nếu lời hứa là điều mới mẻ đối với bạn, hãy bắt đầu với Giải thích về lời hứa JavaScript.
API tìm nạp là gì?
Tìm nạp là giao diện dựa trên lời hứa để thực hiện các yêu cầu HTTP. Nó thay thế cái cũ hơn, dựa trên cuộc gọi lại XMLHttpRequest và nhiều dự án hiện sử dụng nó thay vì thêm thư viện cho các cuộc gọi đơn giản.
| tính năng | Tìm nạp | Axios (thư viện) |
|---|---|---|
| Cài đặt | Được xây dựng trong | Đã thêm dưới dạng phụ thuộc |
| Nội dung JSON | Hãy tự xâu chuỗi nó | tự động |
| Phân tích phản hồi JSON | Gọi response.json() |
tự động |
| Lỗi HTTP bị từ chối? | Không | Có, theo mặc định |
| Hết giờ | Thông qua AbortSignal |
Tùy chọn timeout |
Một yêu cầu NHẬN
Fetch thực hiện yêu cầu GET theo mặc định. Có hai bước và mỗi bước cần await: đầu tiên các tiêu đề phản hồi đến và sau đó bạn đọc nội dung.
const response = await fetch("https://example.com/users/1");
const user = await response.json();
console.log(user);
// { id: 1, name: 'Asha' }
Hai bước tồn tại vì phần thân có thể lớn và đến muộn hơn các tiêu đề. Trong tập lệnh trình duyệt, cấp cao nhất await cần một mô-đun, vì vậy bạn thường sẽ đặt mô-đun này bên trong hàm async. Xem Hướng dẫn chờ đợi/không đồng bộ JavaScript của chúng tôi.
Đối tượng phản hồi
Trước khi đọc nội dung, bạn có thể kiểm tra phản hồi:
console.log(response.status, response.ok, response.headers.get("content-type"));
// 200 true application/json
| Thuộc tính hoặc phương thức | Cung cấp cho bạn |
|---|---|
response.ok |
true cho trạng thái 200 đến 299 |
response.status |
Mã trạng thái, chẳng hạn như 404 |
response.headers.get(name) |
Một tiêu đề phản hồi |
response.json() |
Nội dung được phân tích cú pháp dưới dạng JSON |
response.text() |
Thân xác như một sợi dây |
response.blob() |
Dữ liệu nhị phân, chẳng hạn như hình ảnh |
Một nội dung chỉ có thể được đọc một lần. Gọi json() lần thứ hai không thành công trong thử nghiệm của chúng tôi:
await res.json();
await res.json();
// TypeError: Body is unusable: Body has already been read
Nếu bạn cần đọc nó hai lần, hãy gọi response.clone() trước.
Điều ngạc nhiên lớn: 404 không ném
Đây là điều quan trọng nhất trong bài viết này. Chúng tôi đã yêu cầu một người dùng không tồn tại:
const res = await fetch("https://example.com/users/999");
console.log(res.status, res.ok);
// 404 false
Không có ngoại lệ nào được ném ra. Về phần tìm nạp, yêu cầu đã hoạt động: máy chủ đã được truy cập và nó đã phản hồi. Lời hứa chỉ từ chối khi không có phản hồi nào có thể sử dụng được, chẳng hạn như lỗi mạng. Vì vậy, mã như thế này có một lỗi ẩn:
try {
const res = await fetch(url);
const data = await res.json(); // may be an error payload
showUser(data); // runs anyway for 404 and 500
} catch (error) {
showError(); // does not run for 404 or 500
}
Hãy kiểm tra Bảng tóm tắt mã trạng thái HTTP của chúng tôi để biết ý nghĩa của từng mã.
Một người trợ giúp có thể tái sử dụng
Đừng lặp lại việc kiểm tra đó ở mọi nơi. Bọc nó một lần:
async function getJson(url, options) {
const response = await fetch(url, options);
if (!response.ok) {
throw new Error(`Request failed with status ${response.status}`);
}
return response.json();
}
try {
await getJson("https://example.com/users/999");
} catch (error) {
console.log("caught:", error.message);
}
// caught: Request failed with status 404
Bây giờ lỗi HTTP và lỗi mạng đều có kết quả giống nhau catch. Chức năng nhỏ này đáng có trong mọi dự án. Phiên bản thực cũng có thể đọc thông báo lỗi từ nội dung phản hồi và xử lý phản hồi 204 No Content, không có JSON để phân tích cú pháp.
ĐĂNG dữ liệu JSON
Truyền một đối tượng tùy chọn làm đối số thứ hai. Đối với JSON, bạn phải tự mình thực hiện hai việc: chuyển đổi dữ liệu thành chuỗi và đặt tiêu đề.
const created = await getJson("https://example.com/users", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "Ben" }),
});
console.log(created);
// { id: 2, name: 'Ben', type: 'application/json' }
Máy chủ thử nghiệm của chúng tôi phản hồi lại loại nội dung mà nó nhận được, xác nhận rằng tiêu đề đã đến. Việc quên tiêu đề đó là nguyên nhân phổ biến gây ra lỗi máy chủ khó hiểu, vì nhiều khung công tác chỉ phân tích cú pháp JSON khi nó được khai báo. Để tải lên một biểu mẫu hoặc các tệp, hãy chuyển một đối tượng FormData làm nội dung và thực hiện không đặt Content-Type, vì trình duyệt cần tự thêm một giá trị biên.
Các phương pháp và tùy chọn khác
| Tùy chọn | Ví dụ | Mục đích |
|---|---|---|
phương pháp |
"PUT", "PATCH", "DELETE" |
Phương thức HTTP |
tiêu đề |
{ Ủy quyền: "Người mang ..." } |
Tiêu đề yêu cầu |
cơ thể |
JSON.stringify(data) |
Cơ quan yêu cầu |
tín hiệu |
AbortSignal.timeout(5000) |
Đang hủy |
thông tin xác thực |
"bao gồm" |
Gửi cookie có nguồn gốc chéo |
bộ nhớ đệm |
"không có cửa hàng" |
Hành vi bộ đệm của trình duyệt |
Lựa chọn giữa REST và các kiểu API khác? So sánh của chúng tôi về REST so với GraphQL cho thấy mức độ tìm nạp phù hợp với từng loại.
Chuỗi truy vấn
Không xây dựng chuỗi truy vấn bằng cách nối văn bản vì các ký tự đặc biệt sẽ ngắt chuỗi. URLSearchParams xử lý mã hóa cho bạn:
const params = new URLSearchParams({ q: "red shoes", page: 2 });
console.log(params.toString());
// q=red+shoes&page=2
await getJson(`https://example.com/search?${params}`);
// { q: 'red shoes', page: '2' }
Máy chủ đã nhận được red shoes chính xác và dung lượng đã được khôi phục.
Hết thời gian chờ và hủy
Tìm nạp sẽ đợi rất lâu trên một máy chủ chậm trừ khi bạn thông báo khác. AbortSignal.timeout() đặt ra giới hạn. Điểm cuối thử nghiệm của chúng tôi mất hai giây, so với giới hạn 200 mili giây:
try {
await fetch("https://example.com/slow", { signal: AbortSignal.timeout(200) });
} catch (error) {
console.log(error.name);
}
// TimeoutError
Để hủy thủ công, chẳng hạn như khi người dùng rời khỏi một trang hoặc nhập cụm từ tìm kiếm mới, hãy sử dụng AbortController:
const controller = new AbortController();
const pending = fetch("https://example.com/slow", { signal: controller.signal });
controller.abort();
try {
await pending;
} catch (error) {
console.log(error.name);
}
// AbortError
Để chạy nhiều yêu cầu cùng một lúc, hãy sử dụng Promise.all, nhanh hơn nhiều so với việc chờ từng yêu cầu một:
const [user, search] = await Promise.all([
getJson("https://example.com/users/1"),
getJson("https://example.com/search?q=a&page=1"),
]);
Mọi loại thất bại
Đây là hình ảnh của từng thất bại trong quá trình thực hiện của chúng tôi, cùng với cách phân biệt chúng:
| Tình huống | Chuyện gì xảy ra | Làm thế nào để phát hiện nó |
|---|---|---|
| Máy chủ trả về 404 hoặc 500 | Lời hứa thực hiện | response.ok là sai |
| Không thể truy cập máy chủ | Từ chối với TypeError |
bắt |
| Đã hết thời gian chờ | Từ chối với TimeoutError |
error.name |
| Đã hủy thủ công | Từ chối với AbortError |
error.name |
| Nội dung JSON không hợp lệ | json() từ chối với SyntaxError |
bắt |
Hàng cuối cùng đó là phổ biến trong sản xuất. Proxy trả về 502 thường gửi trang lỗi HTML. Chúng tôi đã sao chép lại điều này và res.json() đã ném SyntaxError. Kiểm tra response.ok trước khi phân tích cú pháp có nghĩa là bạn báo cáo vấn đề thực sự chứ không phải lỗi phân tích cú pháp khó hiểu.
Mẹo: Hãy cố ý kiểm tra các đường dẫn lỗi này. Các công cụ dành cho nhà phát triển trình duyệt có thể mô phỏng trạng thái ngoại tuyến và các công cụ kiểm tra có thể mô phỏng phản hồi 500. Hướng dẫn kiểm tra API với Postman của chúng tôi bao gồm việc kiểm tra phía API.
CORS và thông tin xác thực
Trong trình duyệt, yêu cầu từ nguồn này đến nguồn khác phải tuân theo CORS, quy tắc chia sẻ tài nguyên giữa nhiều nguồn. Nếu bạn thấy lỗi đề cập đến Access-Control-Allow-Origin, thì cách khắc phục thuộc về máy chủ, máy chủ này phải cho phép trang web của bạn. Trong JavaScript của bạn, lỗi chỉ hiển thị dưới dạng lỗi chung TypeError, vì vậy hãy xem bảng điều khiển trình duyệt để biết lý do thực tế. Node.js không thực thi CORS, do đó, một yêu cầu hoạt động trong tập lệnh vẫn có thể bị lỗi trong trình duyệt.
Theo mặc định, trình duyệt không gửi cookie theo yêu cầu có nguồn gốc chéo. Đặt credentials: "include" nếu bạn cần và đảm bảo máy chủ cho phép điều đó. Không bao giờ đặt các khóa API bí mật vào JavaScript của trình duyệt vì bất kỳ ai cũng có thể đọc được chúng. Giữ chúng trên máy chủ của bạn.
Những lỗi thường gặp
- Không kiểm tra
response.ok. Phản hồi lỗi được coi là thành công. - Quên điều thứ hai
await.response.json()cũng trả lại một lời hứa. - Quên
JSON.stringify. Truyền một vật khi cơ thể gửi[object Object]. - Đặt
Content-TypevớiFormData. Điều này phá vỡ ranh giới, vì vậy hãy loại bỏ nó. - Không có thời gian chờ. Yêu cầu bị treo có thể khiến vòng quay của trang chạy vô thời hạn.
- Phân tích cú pháp JSON để có phản hồi trống. A 204 không có nội dung và
json()sẽ ném.
Lời kết
Tìm nạp rất đơn giản khi bạn nhớ quy tắc chính của nó: một phản hồi không giống như một thành công. Sao chép trình trợ giúp nhỏ vào dự án của bạn, thêm thời gian chờ và kiểm tra các đường dẫn thất bại của bạn. Bước tiếp theo, hãy xây dựng một trang nhỏ tải dữ liệu từ API, hiển thị thông báo lỗi rõ ràng và cho phép người dùng hủy tìm kiếm chậm.
Câu hỏi thường gặp
Tìm nạp có gây ra lỗi trên 404 không?
Không. Việc tìm nạp chỉ từ chối khi không nhận được phản hồi nào, chẳng hạn như khi mạng bị lỗi. Đối với các lỗi HTTP, hãy tự kiểm tra phản hồi.ok hoặc phản hồi.status.
Làm cách nào để gửi JSON bằng cách tìm nạp?
Đặt phương thức thành POST, thêm tiêu đề Kiểu nội dung của ứng dụng/json và chuyển dữ liệu qua JSON.stringify làm nội dung.
Tại sao tôi cần hai lần chờ khi tìm nạp?
Việc đầu tiên được giải quyết khi tiêu đề phản hồi đến. Việc thứ hai chờ nội dung tải xuống và được phân tích cú pháp, việc này có thể xảy ra sau.
Làm cách nào để đặt thời gian chờ khi tìm nạp?
Tín hiệu truyền: AbortSignal.timeout(5000) trong các tùy chọn. Sau đó, yêu cầu sẽ từ chối với TimeoutError nếu mất nhiều thời gian hơn nhiều mili giây.
Tìm nạp có sẵn trong Node.js không?
Đúng. Tìm nạp có sẵn trên toàn cầu trong Node.js 18 trở lên. Các phiên bản cũ hơn cần một gói, mặc dù quy tắc CORS chỉ áp dụng trong trình duyệt.
Tiếp tục học hỏi
Cần trợ giúp về kiểm tra, WordPress hoặc SEO?
Chúng tôi giúp các nhóm phát triển phần mềm tốt hơn và phát triển trang web của họ. Hãy cho chúng tôi biết bạn đang làm gì và chúng tôi sẽ đề xuất bước tiếp theo rõ ràng.
Thêm hướng dẫn về thử nghiệm, AI và phát triển hiện đại
Bạn thích bài viết này? Chọn một chủ đề và chuyển ngay sang phần hướng dẫn mới nhất của chúng tôi.
Giải thích về ảo giác AI: Tại sao các mô hình ngôn ngữ lại tạo nên mọi thứ và cách giảm thiểu nó
Ảo giác AI đã giải thích: chúng là gì, tại sao mô hình ngôn ngữ tạo ra chúng, các loại phổ biến, cách giảm thiểu chúng bằng cách căn cứ và nhắc nhở …
Đọc bài viết →DevOpsGiải thích về các biến môi trường: Tệp .env, bí mật và cấu hình được thực hiện đúng
Các biến môi trường được giải thích bằng các ví dụ Python mà chúng tôi đã chạy: đọc và thiết lập chúng, tại sao mọi giá trị đều là một chuỗi, tệp .e…
Đọc bài viết →Phát triển phần mềmGiải thích về giới hạn tỷ lệ API: Thuật toán, tiêu đề và xử lý lỗi 429
Giới hạn tốc độ API được giải thích bằng mô phỏng mà chúng tôi đã chạy: nhóm mã thông báo, cửa sổ cố định, cửa sổ trượt, 429 phản hồi, tiêu đề giới …
Đọc bài viết →Tự động hóa kiểm thửChế giễu bằng Python: unittest.mock, patch và những sai lầm khiến bài kiểm tra nói dối
Mô phỏng bằng Python với unittest.mock, đã được thử nghiệm: Mock và return_value, side_effect, vá lỗi nơi sử dụng tên, thông số kỹ thuật và thông số…
Đọc bài viết →Kiểm thử phần mềmGiải thích về phạm vi bảo hiểm của mã: Phạm vi tuyến so với chi nhánh và ý nghĩa thực sự 100%
Phạm vi bảo hiểm mã được giải thích bằng cách chạy phạm vi bảo hiểm thực tế: phạm vi bảo hiểm dòng, chi nhánh và điều kiện, đọc báo cáo, lý do tại s…
Đọc bài viết →Cơ sở dữ liệu & SQLDELETE vs TRUNCATE vs DROP trong SQL: Sự khác biệt, khôi phục và thời điểm sử dụng mỗi loại
DELETE vs TRUNCATE vs DROP được giải thích bằng SQL đã được thử nghiệm: mỗi loại loại bỏ, khôi phục, kích hoạt, đặt lại danh tính, tốc độ và Postgre…
Đọc bài viết →Cơ sở dữ liệu & SQLGiải thích về Chế độ xem SQL: Tạo, sử dụng và tránh những cạm bẫy, kèm theo ví dụ
Chế độ xem SQL được giải thích bằng các truy vấn chúng tôi đã chạy: tạo chế độ xem, kết quả trực tiếp, ẩn cột, hiệu suất, chế độ xem có thể cập nhật…
Đọc bài viết →Phát triển phần mềmGiao diện TypeScript so với loại: Sự khác biệt thực sự, được thử nghiệm bằng trình biên dịch
Giao diện TypeScript so với loại, được kiểm tra bằng trình biên dịch thực: cả hai có thể làm gì, chỉ một người có thể làm gì, hợp nhất khai báo, mở …
Đọc bài viết →Phát triển phần mềmGiải thích về Python *args và **kwargs: Hàm linh hoạt với ví dụ rõ ràng
Python *args và **kwargs được giải thích bằng mã chúng tôi đã chạy: đóng gói và giải nén, thứ tự tham số, đối số chỉ từ khóa và chỉ vị trí, trình tr…
Đọc bài viết →Phát triển phần mềmHàm Lambda của Python: Cú pháp, cách sử dụng thực tế và khi nào không nên sử dụng chúng
Các hàm lambda của Python được giải thích bằng mã chúng tôi đã chạy: cú pháp, sắp xếp bằng khóa, bản đồ và bộ lọc, các phần đóng, bẫy liên kết muộn …
Đọc bài viết →Trí tuệ nhân tạoĐại lý AI là gì? Cách chúng hoạt động, với vòng lặp tác nhân đơn giản, bạn có thể chạy
Tác nhân AI là gì? Hướng dẫn đơn giản về vòng lặp tác nhân, công cụ, bộ nhớ và lan can, với một vòng lặp Python nhỏ mà chúng tôi đã chạy, những rủi …
Đọc bài viết →DevOpsGiám sát và Khả năng quan sát: Sự khác biệt thực sự, với nhật ký, số liệu và dấu vết
Giải thích về giám sát và khả năng quan sát: lỗi đã biết và chưa biết, nhật ký, số liệu và dấu vết, hướng dẫn về sự cố thanh toán, tín hiệu vàng, Op…
Đọc bài viết →DevOpsDocker Volumes vs Bind Mounts: Duy trì dữ liệu vùng chứa đúng cách
Giải thích về khối lượng Docker và liên kết gắn kết: tại sao dữ liệu vùng chứa biến mất, khối lượng được đặt tên, liên kết gắn kết, tmpfs, ví dụ về …
Đọc bài viết →Tự động hóa kiểm thửTDD vs BDD: Key Differences, One Feature Built Both Ways and When to Use Each
TDD và BDD được giải thích bằng một tính năng giảm giá được xây dựng theo cả hai cách: tái cấu trúc màu đỏ-xanh với mã chúng tôi đã chạy, kịch bản C…
Đọc bài viết →Kiểm thử phần mềmKiểm tra chấp nhận của người dùng (UAT): Quy trình, danh sách kiểm tra và ví dụ thực tế
Giải thích về thử nghiệm chấp nhận của người dùng: ai chạy nó, nó khác với QA như thế nào, quy trình bảy bước, mẫu trường hợp thử nghiệm UAT, danh s…
Đọc bài viết →Cơ sở dữ liệu & SQLGiải thích về các giá trị NULL của SQL: IS NULL, COALESCE, NULLIF và những cái bẫy cần tránh
Các giá trị SQL NULL được giải thích bằng các truy vấn chúng tôi đã chạy: logic ba giá trị, IS NULL, COALESCE, NULLIF, cách tổng hợp, kết hợp và sắp…
Đọc bài viết →Cơ sở dữ liệu & SQLCâu lệnh SQL CASE WHEN: Cú pháp, ví dụ thực tế và các lỗi thường gặp
TRƯỜNG HỢP SQL KHI được giải thích bằng các truy vấn mà chúng tôi đã chạy: các biểu mẫu đơn giản và được tìm kiếm, thứ tự điều kiện, các thủ thuật S…
Đọc bài viết →Phát triển phần mềmJWT là gì? Mã thông báo Web JSON được giải thích bằng một ví dụ hoạt động
JWT là gì? Mã thông báo Web JSON đã giải thích: ba phần, mã thông báo được xây dựng và giả mạo trong mã chúng tôi đã chạy, JWT so với phiên, lưu trữ…
Đọc bài viết →Phát triển phần mềmGiải thích về vòng lặp sự kiện JavaScript: Ngăn xếp cuộc gọi, Microtask và bộ hẹn giờ kèm ví dụ
Vòng lặp sự kiện JavaScript được giải thích bằng mã chúng tôi đã chạy: ngăn xếp cuộc gọi, hàng đợi tác vụ và vi nhiệm, tại sao setTimeout 0 không di…
Đọc bài viết →Phát triển phần mềmGiải thích về trình tạo và năng suất của Python: Tiết kiệm bộ nhớ bằng các ví dụ thực tế
Trình tạo và lợi nhuận Python được giải thích bằng mã chúng tôi đã chạy: cách chúng tạm dừng và tiếp tục, đo mức tiết kiệm bộ nhớ, quy trình, chuỗi …
Đọc bài viết →Trí tuệ nhân tạoNhúng là gì? Giải thích sự tương đồng về vectơ và Cosine một cách đơn giản
nhúng là gì? Hướng dẫn bằng ngôn ngữ đơn giản về vectơ, độ tương tự cosine và tìm kiếm ngữ nghĩa, với một ví dụ nhỏ mà chúng tôi đã chạy, các cách s…
Đọc bài viết →DevOpsTriển khai Blue-Green và Canary: Sự khác biệt, sự đánh đổi và cách lựa chọn
Giải thích về triển khai Blue-green và Canary: cách hoạt động của từng loại, chi phí, rủi ro và khôi phục, nhóm người dùng ổn định mà chúng tôi đã t…
Đọc bài viết →Tự động hóa kiểm thửKiểm tra không ổn định: Nguyên nhân gây ra chúng và cách khắc phục chúng vĩnh viễn
Các thử nghiệm không ổn định được giải thích bằng các bản demo mà chúng tôi đã chạy: nguyên nhân chính, cách xác nhận và chẩn đoán nguyên nhân, cách…
Đọc bài viết →Kiểm thử phần mềmKiểm tra tải và kiểm tra căng thẳng: Sự khác biệt, số liệu và ví dụ về k6
Giải thích về thử nghiệm tải và thử nghiệm căng thẳng: mỗi thử nghiệm chứng minh điều gì, thử nghiệm tăng đột biến và ngâm, số liệu quan trọng, lý d…
Đọc bài viết →Kiểm thử phần mềmTrường hợp thử nghiệm và kịch bản thử nghiệm: Sự khác biệt chính, ví dụ và thời điểm sử dụng từng trường hợp
Giải thích trường hợp kiểm thử và kịch bản kiểm thử: định nghĩa rõ ràng, bảng cạnh nhau, một tính năng đặt lại mật khẩu được lấy từ các tình huống n…
Đọc bài viết →Cơ sở dữ liệu & SQLTối ưu hóa truy vấn SQL: Đọc kế hoạch thực thi và sửa các truy vấn chậm, có tính thời gian
Đã thử nghiệm tối ưu hóa truy vấn SQL trên một triệu hàng: đọc kế hoạch thực hiện, thêm chỉ mục phù hợp, sửa các bộ lọc không thể mở rộng, sử dụng c…
Đọc bài viết →Cơ sở dữ liệu & SQLSQL UNION và UNION ALL: Sự khác biệt, ví dụ và hiệu suất đã được kiểm tra
SQL UNION và UNION ALL được giải thích bằng các truy vấn chúng tôi đã chạy: trùng lặp, cả hai quy tắc đều tuân theo, lỗi dữ liệu thực, hiệu suất đượ…
Đọc bài viết →Phát triển phần mềmHướng dẫn API tìm nạp JavaScript: GET, POST, Xử lý lỗi và hết thời gian chờ
Hướng dẫn API tìm nạp JavaScript đã được thử nghiệm trên máy chủ cục bộ: GET và POST, tại sao 404 không gửi, trình trợ giúp có thể sử dụng lại, chuỗ…
Đọc bài viết →Phát triển phần mềmXử lý tệp Python: Đọc, ghi, CSV, JSON và pathlib kèm ví dụ
Việc xử lý tệp Python được giải thích bằng mã chúng tôi đã chạy: chế độ mở, với, đọc tệp lớn, CSV, JSON, pathlib, tệp nhị phân, ghi an toàn, xử lý l…
Đọc bài viết →Phát triển phần mềmGit merge vs rebase: khác biệt, ví dụ và khi nào dùng cái nào
Git merge vs rebase được giải thích bằng đầu ra log thực tế, bảng so sánh, quy tắc vàng của rebase và quy trình làm việc nhóm an toàn.
Đọc bài viết →Phát triển phần mềmList comprehension trong Python: cú pháp, ví dụ và khi nào nên tránh
List comprehension trong Python: cú pháp, lọc dữ liệu, if-else, vòng lặp lồng nhau, thời gian đo thực tế và khi nào vòng lặp for thông thường tốt hơn.
Đọc bài viết →Cơ sở dữ liệu & SQLGiải thích SQL JOIN kèm ví dụ (Inner, Left, Right, Full)
Hiểu SQL JOIN từng bước với bảng và truy vấn mẫu: INNER, LEFT, RIGHT, FULL, CROSS và SELF, cùng lỗi thường gặp và mẹo hiệu năng.
Đọc bài viết →