AJAX - Gửi yêu cầu đến máy chủ
Đối tượng XMLHttpRequest được sử dụng để trao đổi dữ liệu với máy chủ.
Gửi yêu cầu đến máy chủ
Để gửi yêu cầu đến máy chủ, chúng ta sử dụng các phương thức open() và send() của đối tượng XMLHttpRequest:
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();
Method | Description |
---|---|
open( method, url, async ) | Specifies the type of request method : the type of request: GET or POST url : the server (file) location async : true (asynchronous) or false (synchronous) |
send() | Sends the request to the server (used for GET) |
send( string ) | Sends the request to the server (used for POST) |
NHẬN hoặc ĐĂNG?
GET đơn giản và nhanh hơn POST và có thể được sử dụng trong hầu hết các trường hợp.
Tuy nhiên, hãy luôn sử dụng các yêu cầu POST khi:
- Tệp được lưu trong bộ nhớ đệm không phải là một tùy chọn (cập nhật tệp hoặc cơ sở dữ liệu trên máy chủ).
- Gửi một lượng lớn dữ liệu đến máy chủ (POST không có giới hạn về kích thước).
- Gửi đầu vào của người dùng (có thể chứa các ký tự không xác định), POST mạnh mẽ và an toàn hơn GET.
NHẬN yêu cầu
Một yêu cầu GET đơn giản:
Trong ví dụ trên, bạn có thể nhận được kết quả được lưu trong bộ nhớ đệm. Để tránh điều này, hãy thêm một ID duy nhất vào URL:
Nếu bạn muốn gửi thông tin bằng phương thức GET, hãy thêm thông tin vào URL:
Ví dụ
xhttp.open("GET", "demo_get2.asp?fname=Henry&lname=Ford", true);
xhttp.send();
Hãy tự mình thử » ĐĂNG yêu cầu
Một yêu cầu POST đơn giản:
Để ĐĂNG dữ liệu như biểu mẫu HTML, hãy thêm tiêu đề HTTP bằng setRequestHeader(). Chỉ định dữ liệu bạn muốn gửi trong phương thức send():
Ví dụ
xhttp.open("POST", "demo_post2.asp", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("fname=Henry&lname=Ford");
Hãy tự mình thử »Method | Description |
---|---|
setRequestHeader( header, value ) | Adds HTTP headers to the request header : specifies the header name value : specifies the header value |
Url - Tệp trên máy chủ
Tham số url của phương thức open() là địa chỉ của một tệp trên máy chủ:
xhttp.open("GET", "ajax_test.asp", true);
Tệp này có thể là bất kỳ loại tệp nào, như .txt và .xml hoặc các tệp tập lệnh máy chủ như .asp và .php (có thể thực hiện các hành động trên máy chủ trước khi gửi phản hồi lại).
Không đồng bộ - Đúng hay sai?
Yêu cầu máy chủ phải được gửi không đồng bộ.
Tham số async của phương thức open() phải được đặt thành true:
xhttp.open("GET", "ajax_test.asp", true);
Bằng cách gửi không đồng bộ, JavaScript không phải đợi phản hồi của máy chủ mà thay vào đó có thể:
- thực thi các tập lệnh khác trong khi chờ phản hồi của máy chủ
- xử lý phản hồi sau khi phản hồi đã sẵn sàng
Thuộc tính onreadystatechange
Với đối tượng XMLHttpRequest, bạn có thể xác định một hàm sẽ được thực thi khi yêu cầu nhận được câu trả lời.
Hàm này được xác định trong thuộc tính onreadystatechange của đối tượng XMLHttpResponse:
Ví dụ
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("demo").innerHTML = this.responseText;
}
};
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();
Hãy tự mình thử »Tệp "ajax_info.txt" được sử dụng trong ví dụ trên là một tệp văn bản đơn giản và có dạng như sau:
<h1>AJAX</h1>
<p>AJAX is not a programming language.</p>
<p>AJAX is a
technique for accessing web servers from a web page.</p>
<p>AJAX stands for
Asynchronous JavaScript And XML.</p>
Bạn sẽ tìm hiểu thêm về onreadystatechange trong chương sau.
Yêu cầu đồng bộ
Để thực hiện một yêu cầu đồng bộ, hãy thay đổi tham số thứ ba trong phương thức open() thành false:
xhttp.open("GET", "ajax_info.txt", false);
Đôi khi async = false được sử dụng để kiểm tra nhanh. Bạn cũng sẽ tìm thấy các yêu cầu đồng bộ trong mã JavaScript cũ hơn.
Vì mã sẽ đợi máy chủ hoàn thành nên không cần có hàm onreadystatechange:
Ví dụ
xhttp.open("GET", "ajax_info.txt", false);
xhttp.send();
document.getElementById("demo").innerHTML = xhttp.responseText;
Hãy tự mình thử »XMLHttpRequest đồng bộ (async = false) không được khuyến nghị vì JavaScript sẽ ngừng thực thi cho đến khi phản hồi của máy chủ sẵn sàng. Nếu máy chủ bận hoặc chậm, ứng dụng sẽ bị treo hoặc dừng.
XMLHttpRequest đồng bộ đang trong quá trình bị loại bỏ khỏi tiêu chuẩn web, nhưng quá trình này có thể mất nhiều năm.
Các công cụ dành cho nhà phát triển hiện đại được khuyến khích cảnh báo về việc sử dụng các yêu cầu đồng bộ và có thể đưa ra ngoại lệ InvalidAccessError khi nó xảy ra.