10/10/2018, 09:42
Ajax!!!!! Help help! Xin các bác chỉ giáo
Em đang xây dựng một webservice trong đó có một module giao tiếp với một ứng dụng server-side dùng API qua HTTP với yêu cầu:
Ứng dụng server-side cung cấp thư viện API để truy vấn trạng thái dưới dạng XML. Ví dụ truy vấn:
Sẽ trả về danh sách các user đang truy cập vào hệ thống theo cấu trúc XML:
Nhiệm vụ là từ webservice, thực hiện truy vấn với URL như trên và hiển thị kết quả các User01,02,03,04,...
Ý tưởng của em là dùng Ajax request tới một file "api.php" chứa dòng code:
sau khi server xử lý, file api.php nhận được thông tin XML và trả về cho XMLHttpRequest sau đó xử lý hiển thị.
Tuy nhiên, ko hiểu đoạn code của e có vấn đề gì nữa mà nhận được thông tin XML rồi xử lý không nổi nữa. Tất nhiên trường hợp đặt ra là thông tin XML lúc nào cũng y hệt như vậy, không thay đổi.
Kết quả là "Caugh Exception: undefined"
Nếu chỉ dùng link http://localhost/api.php thì thông tin XML vẫn hiển thị trên browser bình thường. Không biết có liên quan gì đến cái vụ xử lý tại lớp Ajax ko nữa. Các bác xem hộ em ^^. Nếu có giải pháp khác cũng xin các bác chỉ bảo.
Ứng dụng server-side cung cấp thư viện API để truy vấn trạng thái dưới dạng XML. Ví dụ truy vấn:
Code:
http://localhost:1234/admin/displayUsers?aid=admin&apw=123456
Code:
<?xml version="1.0" encoding="utf-8"?> <result> <state>complete</state> <code>AdminNetCall.Connection.Success</code> <timestamp>7/9/2009 5:06:53 PM</timestamp> <data> <name>_defaultRoot_:_defaultVHost_:::_1</name> <_0>User01</_0> <_1>User02</_1> <_2>User03</_2> <_3>User04</_3> </data> </result>
Ý tưởng của em là dùng Ajax request tới một file "api.php" chứa dòng code:
Code:
<?header('location:http://localhost:1234/admin/displayUsers?aid=admin&apw=123456');?>
Tuy nhiên, ko hiểu đoạn code của e có vấn đề gì nữa mà nhận được thông tin XML rồi xử lý không nổi nữa. Tất nhiên trường hợp đặt ra là thông tin XML lúc nào cũng y hệt như vậy, không thay đổi.
Code:
<script language="javascript"> var httpRq; var url = 'api.php'; httpRq = GetXmlHttpObject(); //hàm khởi tạo đối tượng XMLHttpRequest httpRq.onreadystatechange = function() { try { if (httpRq.readyState==4) { var xmlDoc = httpRq.respon***ML; var markers = xmlDoc.documentElement.getElementsByTagName("result"); for (var i=0;i<markers.childNodes[3].childNodes.length;i++) { alert(markers.childNodes[3].childNodes[i].nodeValue); } } } catch (e) { alert('Caugh Exception: '+e.description); } }; httpRq.open('GET',url,true); httpRq.send('); </script>
Nếu chỉ dùng link http://localhost/api.php thì thông tin XML vẫn hiển thị trên browser bình thường. Không biết có liên quan gì đến cái vụ xử lý tại lớp Ajax ko nữa. Các bác xem hộ em ^^. Nếu có giải pháp khác cũng xin các bác chỉ bảo.
Bài liên quan
Thử alert(httpRq.respon***ML);
Nếu nó chạy được thì làm tiếp các bước sau:
Cách 1 (có quảng cáo )
bạn down cái này về: http://vnjs.net/www/src/kombai.rar, giải nén rồi đặt cái file js này vào site.
Tiếp theo trong đoạn code if (httpRq.readyState==4) {}
bạn thêm vào như sau:
if (httpRq.readyState==4) {
K.discover(httpRq.respon***ML);
//code khac;
}
Cách thứ 2 (được thực hiện nhờ xem qua cách 1):
function getTextContent(node) {
if (!node) {return ""}
if (node.text) {return node.text}
else if (node.textContent) {return node.textContent}
else {return ""}
}
Cách xử dụng:
var XML = httpRq.respon***ML.documentElement;
var data = XML.getElementsByTagName('data')***91;0***93;;
var name = getTextContent(data.childNodes***91;0***93;);
var user0 = getTextContent(data.childNodes***91;1***93;);
....
Nếu bạn có thể thay tên các tag <_0>, <_1> thành cùng một tên thì lấy dữ liệu sẽ dễ hơn.
alert(httpRq.respon***ML); -> chỉ được alert trắng tinh, httpRq.readyState==4 nhưng xmlHttpRequest.status = 0, chứ ko phải = 200, có bro nào giải thích giùm mình với.
[=========> Bổ sung bài viết <=========]
Mình đã check được lỗi là từ câu lệnh gán giá trị respon***ML cho biến thông tin.
Àh còn 1 điểm nữa, đó là xmlHttpRequest.status khi nhận được kết quả không trả về giá trị "200" như bình thường (là giá trị Done của W3C) mà lại trả về giá trị "0", mã lỗi của xmlHttpRequest.statusText cũng vẫn là "OK"
Cấu trúc XML của bạn chưa khoa học. Nếu xem mỗi user là 1 item thì bạn đặt nên chúng vào cùng 1 level, và sử dùng cùng tên node để dễ truy vấn theo chỉ mục bằng những vòng lặp.