Làm cách nào để tìm nạp dữ liệu từ tệp JSON?

Fetch API cung cấp giao diện JavaScript để truy cập và thao tác các phần của giao thức, chẳng hạn như yêu cầu và phản hồi. Nó cũng cung cấp một phương thức

fetch['//example.com', {
  credentials: 'include'
}];
0 toàn cầu cung cấp một cách dễ dàng, hợp lý để tìm nạp tài nguyên không đồng bộ trên mạng

Loại chức năng này trước đây đã đạt được bằng cách sử dụng

fetch['//example.com', {
  credentials: 'include'
}];
1. Tìm nạp cung cấp giải pháp thay thế tốt hơn có thể dễ dàng sử dụng bởi các công nghệ khác như
fetch['//example.com', {
  credentials: 'include'
}];
2. Tìm nạp cũng cung cấp một vị trí hợp lý duy nhất để xác định các khái niệm liên quan đến HTTP khác như CORS và tiện ích mở rộng cho HTTP

Thông số kỹ thuật của

fetch['//example.com', {
  credentials: 'include'
}];
3 khác với
fetch['//example.com', {
  credentials: 'include'
}];
4 theo những cách quan trọng sau

  • Lời hứa được trả về từ
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    0 sẽ không từ chối trạng thái lỗi HTTP ngay cả khi phản hồi là HTTP 404 hoặc 500. Thay vào đó, ngay sau khi máy chủ phản hồi với các tiêu đề, Lời hứa sẽ giải quyết bình thường [với thuộc tính
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    6 của phản hồi được đặt thành false nếu phản hồi không nằm trong phạm vi 200–299] và nó sẽ chỉ từ chối khi lỗi mạng hoặc
  • Trừ khi
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    0 được gọi với tùy chọn
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    8 được đặt thành
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    9,
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    0
    • sẽ không gửi cookie trong các yêu cầu có nguồn gốc chéo
    • sẽ không đặt bất kỳ cookie nào được gửi lại trong các phản hồi trên nhiều nguồn gốc
    • Kể từ tháng 8 năm 2018, chính sách thông tin đăng nhập mặc định đã thay đổi thành cùng nguồn gốc. Firefox cũng được sửa đổi trong phiên bản 61. 0b13]

Yêu cầu tìm nạp cơ bản thực sự đơn giản để thiết lập. Hãy xem đoạn mã sau

fetch['//example.com', {
  credentials: 'include'
}];
1

Ở đây chúng tôi đang tìm nạp một tệp JSON trên mạng và in nó ra bảng điều khiển. Cách sử dụng đơn giản nhất của

fetch['//example.com', {
  credentials: 'include'
}];
0 nhận một đối số — đường dẫn đến tài nguyên bạn muốn tìm nạp — và không trực tiếp trả về nội dung phản hồi JSON mà thay vào đó trả về một lời hứa giải quyết bằng đối tượng
fetch['//example.com', {
  credentials: 'include'
}];
32

Đổi lại, đối tượng

fetch['//example.com', {
  credentials: 'include'
}];
32 không trực tiếp chứa nội dung phản hồi JSON thực tế mà thay vào đó là biểu diễn của toàn bộ phản hồi HTTP. Vì vậy, để trích xuất nội dung phần thân JSON từ đối tượng
fetch['//example.com', {
  credentials: 'include'
}];
32, chúng tôi sử dụng phương thức
fetch['//example.com', {
  credentials: 'include'
}];
35, phương thức này trả về một lời hứa thứ hai giải quyết bằng kết quả phân tích văn bản nội dung phản hồi dưới dạng JSON

Ghi chú. Xem phần Nội dung để biết các phương pháp tương tự để trích xuất các loại nội dung nội dung khác

Các yêu cầu tìm nạp được kiểm soát bởi chỉ thị

fetch['//example.com', {
  credentials: 'include'
}];
36 của Chính sách bảo mật nội dung thay vì chỉ thị của các tài nguyên mà nó đang truy xuất

Cung cấp tùy chọn yêu cầu

Phương thức

fetch['//example.com', {
  credentials: 'include'
}];
0 có thể tùy chọn chấp nhận tham số thứ hai, đối tượng
fetch['//example.com', {
  credentials: 'include'
}];
38 cho phép bạn kiểm soát một số cài đặt khác nhau

Xem

fetch['//example.com', {
  credentials: 'include'
}];
0 để biết các tùy chọn đầy đủ có sẵn và biết thêm chi tiết

fetch['//example.com', {
  credentials: 'include'
}];
1

Lưu ý rằng

fetch['//example.com', {
  credentials: 'include'
}];
20 chỉ cho phép một bộ tiêu đề giới hạn trong yêu cầu

  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    21
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    22
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    23
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    24 với giá trị là
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    25,
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    26 hoặc
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    27

Gửi yêu cầu có kèm theo thông tin xác thực

Để khiến các trình duyệt gửi yêu cầu có thông tin đăng nhập được bao gồm trong cả lệnh gọi cùng nguồn gốc và nguồn gốc chéo, hãy thêm

fetch['//example.com', {
  credentials: 'include'
}];
28 vào đối tượng
fetch['//example.com', {
  credentials: 'include'
}];
38 mà bạn chuyển đến phương thức
fetch['//example.com', {
  credentials: 'include'
}];
0

fetch['//example.com', {
  credentials: 'include'
}];

Ghi chú.

fetch['//example.com', {
  credentials: 'include'
}];
41 bị cấm sử dụng ký tự đại diện cho các yêu cầu với
fetch['//example.com', {
  credentials: 'include'
}];
28. Trong những trường hợp như vậy, nguồn gốc chính xác phải được cung cấp;

Ghi chú. Các trình duyệt không được gửi thông tin đăng nhập trong các yêu cầu chiếu trước bất kể cài đặt này. Để biết thêm thông tin xem. CORS > Yêu cầu có thông tin đăng nhập

Nếu bạn chỉ muốn gửi thông tin đăng nhập nếu URL yêu cầu có cùng nguồn gốc với tập lệnh gọi, hãy thêm

fetch['//example.com', {
  credentials: 'include'
}];
43

fetch['//example.com', {
  credentials: 'include'
}];
3

Thay vào đó, để đảm bảo các trình duyệt không bao gồm thông tin xác thực trong yêu cầu, hãy sử dụng

fetch['//example.com', {
  credentials: 'include'
}];
44

fetch['//example.com', {
  credentials: 'include'
}];
2

Tải lên dữ liệu JSON

Sử dụng

fetch['//example.com', {
  credentials: 'include'
}];
0 để ĐĂNG dữ liệu được mã hóa JSON

fetch['//example.com', {
  credentials: 'include'
}];
4

Tải lên một tập tin

Các tệp có thể được tải lên bằng phần tử đầu vào HTML

fetch['//example.com', {
  credentials: 'include'
}];
46,
fetch['//example.com', {
  credentials: 'include'
}];
47 và
fetch['//example.com', {
  credentials: 'include'
}];
0

fetch['//example.com', {
  credentials: 'include'
}];
5

Tải lên nhiều tệp

Các tệp có thể được tải lên bằng phần tử đầu vào HTML

fetch['//example.com', {
  credentials: 'include'
}];
49,
fetch['//example.com', {
  credentials: 'include'
}];
47 và
fetch['//example.com', {
  credentials: 'include'
}];
0

fetch['//example.com', {
  credentials: 'include'
}];
9

Xử lý từng dòng tệp văn bản

Các đoạn được đọc từ phản hồi không bị ngắt gọn gàng ở ranh giới dòng và là Uint8Arrays, không phải chuỗi. Nếu bạn muốn tìm nạp một tệp văn bản và xử lý từng dòng một, thì bạn phải xử lý những phức tạp này. Ví dụ sau đây cho thấy một cách để thực hiện việc này bằng cách tạo trình lặp dòng [để đơn giản, nó giả sử văn bản là UTF-8 và không xử lý lỗi tìm nạp]

fetch['//example.com', {
  credentials: 'include'
}];
0

Kiểm tra xem quá trình tìm nạp đã thành công chưa

Một lời hứa

fetch['//example.com', {
  credentials: 'include'
}];
0 sẽ từ chối với một
fetch['//example.com', {
  credentials: 'include'
}];
53 khi gặp lỗi mạng hoặc CORS bị định cấu hình sai ở phía máy chủ, mặc dù điều này thường có nghĩa là các vấn đề về quyền hoặc tương tự - chẳng hạn như 404 không phải là lỗi mạng. Kiểm tra chính xác cho một
fetch['//example.com', {
  credentials: 'include'
}];
0 thành công sẽ bao gồm kiểm tra xem lời hứa đã được giải quyết chưa, sau đó kiểm tra xem thuộc tính
fetch['//example.com', {
  credentials: 'include'
}];
55 có giá trị true. Mã sẽ trông giống như thế này

fetch['//example.com', {
  credentials: 'include'
}];
5

Cung cấp đối tượng yêu cầu của riêng bạn

Thay vì chuyển một đường dẫn đến tài nguyên mà bạn muốn yêu cầu vào lệnh gọi

fetch['//example.com', {
  credentials: 'include'
}];
0, bạn có thể tạo một đối tượng yêu cầu bằng cách sử dụng hàm tạo
fetch['//example.com', {
  credentials: 'include'
}];
57 và chuyển nó vào dưới dạng đối số phương thức
fetch['//example.com', {
  credentials: 'include'
}];
0

fetch['//example.com', {
  credentials: 'include'
}];
10

fetch['//example.com', {
  credentials: 'include'
}];
57 chấp nhận chính xác các tham số giống như phương thức
fetch['//example.com', {
  credentials: 'include'
}];
0. Bạn thậm chí có thể chuyển vào một đối tượng yêu cầu hiện có để tạo một bản sao của nó

fetch['//example.com', {
  credentials: 'include'
}];
11

Điều này khá hữu ích, vì các nội dung yêu cầu và phản hồi chỉ có thể được sử dụng một lần. Tạo một bản sao như thế này cho phép bạn sử dụng lại yêu cầu/phản hồi một cách hiệu quả trong khi thay đổi các tùy chọn

fetch['//example.com', {
  credentials: 'include'
}];
38 nếu muốn. Bản sao phải được thực hiện trước khi cơ thể được đọc

Ghi chú. Ngoài ra còn có một phương pháp

fetch['//example.com', {
  credentials: 'include'
}];
92 tạo một bản sao. Cả hai phương pháp tạo bản sao sẽ không thành công nếu nội dung của yêu cầu hoặc phản hồi ban đầu đã được đọc, nhưng việc đọc nội dung của phản hồi hoặc yêu cầu được sao chép sẽ không khiến nó được đánh dấu là đã đọc trong bản gốc

tiêu đề

Giao diện

fetch['//example.com', {
  credentials: 'include'
}];
93 cho phép bạn tạo đối tượng tiêu đề của riêng mình thông qua hàm tạo
fetch['//example.com', {
  credentials: 'include'
}];
94. Một đối tượng tiêu đề là một bản đồ đơn giản gồm nhiều tên thành các giá trị

fetch['//example.com', {
  credentials: 'include'
}];
12

Điều tương tự có thể đạt được bằng cách chuyển một mảng các mảng hoặc một đối tượng bằng chữ cho hàm tạo

fetch['//example.com', {
  credentials: 'include'
}];
13

Nội dung có thể được truy vấn và truy xuất

fetch['//example.com', {
  credentials: 'include'
}];
14

Một số thao tác này chỉ hữu ích trong

fetch['//example.com', {
  credentials: 'include'
}];
95, nhưng chúng cung cấp API đẹp hơn nhiều để thao tác với tiêu đề

Tất cả các phương thức Tiêu đề đưa ra một

fetch['//example.com', {
  credentials: 'include'
}];
53 nếu tên tiêu đề được sử dụng không phải là tên Tiêu đề HTTP hợp lệ. Các hoạt động đột biến sẽ ném một
fetch['//example.com', {
  credentials: 'include'
}];
53 nếu có một người bảo vệ bất biến [xem bên dưới]. Nếu không, họ thất bại âm thầm. Ví dụ

fetch['//example.com', {
  credentials: 'include'
}];
15

Một trường hợp sử dụng tốt cho tiêu đề là kiểm tra xem loại nội dung có chính xác hay không trước khi bạn xử lý thêm. Ví dụ

fetch['//example.com', {
  credentials: 'include'
}];
16

Bảo vệ

Vì các tiêu đề có thể được gửi trong các yêu cầu và nhận được trong các phản hồi và có nhiều hạn chế khác nhau về thông tin nào có thể và nên thay đổi, các đối tượng của tiêu đề có thuộc tính bảo vệ. Điều này không được hiển thị trên Web, nhưng nó ảnh hưởng đến hoạt động đột biến nào được phép trên đối tượng tiêu đề

Các giá trị bảo vệ có thể là

  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    98. mặc định
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    99. bảo vệ cho một đối tượng tiêu đề thu được từ một yêu cầu [______500]
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    01. bảo vệ đối tượng tiêu đề thu được từ yêu cầu được tạo bằng
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    02
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    03
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    04. bảo vệ đối tượng tiêu đề thu được từ phản hồi [
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    05]
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    06. bảo vệ hiển thị đối tượng tiêu đề chỉ đọc;

Ghi chú. Bạn không thể thêm hoặc đặt tiêu đề

fetch['//example.com', {
  credentials: 'include'
}];
07 trên đối tượng tiêu đề được bảo vệ cho một
fetch['//example.com', {
  credentials: 'include'
}];
04. Tương tự, không được phép chèn
fetch['//example.com', {
  credentials: 'include'
}];
09 vào tiêu đề phản hồi. ServiceWorkers không được phép đặt cookie thông qua phản hồi tổng hợp

đối tượng phản hồi

Như bạn đã thấy ở trên,

fetch['//example.com', {
  credentials: 'include'
}];
32 trường hợp được trả lại khi
fetch['//example.com', {
  credentials: 'include'
}];
0 lời hứa được giải quyết

Các thuộc tính phản hồi phổ biến nhất mà bạn sẽ sử dụng là

  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    52 — Một số nguyên [giá trị mặc định 200] chứa mã trạng thái phản hồi
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    53 — Một chuỗi [giá trị mặc định ""], tương ứng với thông báo mã trạng thái HTTP. Lưu ý rằng HTTP/2 không hỗ trợ thông báo trạng thái
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    55 — được sử dụng ở trên, đây là cách viết tắt để kiểm tra xem trạng thái có nằm trong phạm vi bao gồm 200-299 không. Điều này trả về một giá trị boolean

Chúng cũng có thể được tạo theo chương trình thông qua JavaScript, nhưng điều này chỉ thực sự hữu ích trong

fetch['//example.com', {
  credentials: 'include'
}];
95, khi bạn đang cung cấp phản hồi tùy chỉnh cho yêu cầu đã nhận bằng phương pháp
fetch['//example.com', {
  credentials: 'include'
}];
56

fetch['//example.com', {
  credentials: 'include'
}];
17

Hàm tạo

fetch['//example.com', {
  credentials: 'include'
}];
57 nhận hai đối số tùy chọn — một phần thân cho phản hồi và một đối tượng init [tương tự như đối tượng mà
fetch['//example.com', {
  credentials: 'include'
}];
57 chấp nhận. ]

Ghi chú. Phương thức tĩnh

fetch['//example.com', {
  credentials: 'include'
}];
59 trả về phản hồi lỗi. Tương tự,
fetch['//example.com', {
  credentials: 'include'
}];
100 trả về phản hồi dẫn đến chuyển hướng đến một URL được chỉ định. Những điều này cũng chỉ liên quan đến Service Worker

Thân thể

Cả yêu cầu và phản hồi đều có thể chứa dữ liệu cơ thể. Một cơ thể là một thể hiện của bất kỳ loại nào sau đây

  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    101
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    102 [Uint8Array và những người bạn]
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    103
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    104
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    105
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    106, hoặc một chuỗi ký tự
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    107
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    108

Giao diện

fetch['//example.com', {
  credentials: 'include'
}];
109 và
fetch['//example.com', {
  credentials: 'include'
}];
32 chia sẻ các phương thức sau để trích xuất phần thân. Tất cả đều trả lại một lời hứa cuối cùng được giải quyết với nội dung thực tế

  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    111 /
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    112
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    113 /
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    114
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    115 /
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    116
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    117 /
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    118
  • fetch['//example.com', {
      credentials: 'include'
    }];
    
    119 /
    fetch['//example.com', {
      credentials: 'include'
    }];
    
    120

Điều này làm cho việc sử dụng dữ liệu phi văn bản dễ dàng hơn nhiều so với XHR

Nội dung yêu cầu có thể được đặt bằng cách chuyển tham số nội dung

fetch['//example.com', {
  credentials: 'include'
}];
18

Cả yêu cầu và phản hồi [và bằng cách mở rộng chức năng

fetch['//example.com', {
  credentials: 'include'
}];
0], sẽ cố gắng xác định loại nội dung một cách thông minh. Một yêu cầu cũng sẽ tự động đặt tiêu đề
fetch['//example.com', {
  credentials: 'include'
}];
24 nếu không có tiêu đề nào được đặt trong từ điển

phát hiện tính năng

Hỗ trợ Fetch API có thể được phát hiện bằng cách kiểm tra sự tồn tại của

fetch['//example.com', {
  credentials: 'include'
}];
93,
fetch['//example.com', {
  credentials: 'include'
}];
109,
fetch['//example.com', {
  credentials: 'include'
}];
32 hoặc
fetch['//example.com', {
  credentials: 'include'
}];
0 trên phạm vi
fetch['//example.com', {
  credentials: 'include'
}];
127 hoặc
fetch['//example.com', {
  credentials: 'include'
}];
128. Ví dụ

Chủ Đề