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:
Code:
http://localhost:1234/admin/displayUsers?aid=admin&apw=123456
Sẽ trả về danh sách các user đang truy cập vào hệ thống theo cấu trúc XML:
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>
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:
Code:
<?header('location:http://localhost:1234/admin/displayUsers?aid=admin&apw=123456');?>
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.
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>
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.
chukyso viết 11:42 ngày 10/10/2018
http://1kenh.com/ là đỉnh cao về Ajax đấy, học tập nhé bạn
khoanv viết 11:57 ngày 10/10/2018
Cám ơn các bác trước cái đã nhé ><
ngoc_viet08 viết 11:48 ngày 10/10/2018
toàn các pro ...về quảng cáo
uoon viết 11:55 ngày 10/10/2018
Trước tiên không biết bạn xử lý thế nào, nhưng cần đảm bảo gửi request đúng, và nhận được response đúng đã.

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:
PHP Code:
if (httpRq.readyState==4) {
  
K.discover(httpRq.respon***ML);
  
//code khac;

Cái này sẽ cho bạn xem bên trong đối tượng respon***ML có những gì, tùy vào trình duyệt khác nhau nó sẽ khác nhau, dựa vào đấy bạn viết tiếp code để lấy content.

Cách thứ 2 (được thực hiện nhờ xem qua cách 1):
PHP Code:
function getTextContent(node) {
                if (!
node) {return ""}
                if (
node.text) {return node.text}
                else if (
node.textContent) {return node.textContent}
                else {return 
""}
            } 
Hàm này mình chế ra để lấy content của một XML node;

Cách xử dụng:
PHP Code:
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;);
.... 
Đại khái thế.
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.
khoanv viết 11:54 ngày 10/10/2018
@uoon: Thank you bạn! Mình sẽ thử các cách này xem sao.
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.
Code:
var xmlDoc = xmlHttp.respon***ML.documentElement; // Ajax layer báo lỗi

// hoặc 
var markers = xmlDoc.documentElement.getElementsByTagName(result); // Cũng bị báo lỗi
Tuy nhiên mình là newbie JavaScript nên cách xử lý DOM và JS không rành, mong các anh em giúp đỡ.

À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"
sacroyant viết 11:51 ngày 10/10/2018
Lỗi này xảy ra khi bạn test thử trên localhost. Vì cái status này là HTTP Response Headers mà server trả về ở trên giao thức HTTP.

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.
Bài liên quan
0