2008-10-16 57 views

Trả lời

17

Bạn có thể sử dụng dịch vụ web bằng JavaScript nguyên bản bằng cách sử dụng đối tượng XmlHttpRequest. Tuy nhiên instantiating đối tượng này khác nhau giữa các trình duyệt. Ví dụ Firefox và IE 7+ cho phép bạn khởi tạo nó như một đối tượng JavaScript nguyên gốc nhưng IE6 yêu cầu bạn khởi tạo nó như một điều khiển ActiveX.

Vì lý do này, tôi khuyên bạn nên sử dụng thư viện trừu tượng như jQuery. Nếu đó không phải là một tùy chọn thì hãy tóm tắt việc tạo thành phương thức nhà máy và kiểm tra phiên bản trình duyệt.

Để sử dụng tính năng này để thực hiện dịch vụ web, bạn chỉ cần khởi tạo đối tượng và sau đó gọi đó là phương thức open(). Tôi khuyên bạn nên thực hiện điều này là không đồng bộ để giữ cho giao diện người dùng phản hồi. Khi được gọi là async, bạn sẽ nhận được các cuộc gọi lại đến phương thức async được chỉ định của bạn để chỉ ra trạng thái của yêu cầu. Khi trạng thái là 4 (nạp), bạn có thể lấy dữ liệu đáp ứng và sau đó xử lý nó.

Cách bạn xử lý dữ liệu sẽ phụ thuộc vào nó là gì, nếu đó là JSON thì bạn có thể chạy nó thông qua phương thức eval() của JavaScript nhưng có một số tác động bảo mật. Nếu đó là XML, bạn có thể sử dụng DOM XML để xử lý nó.

Xem Wikipedia để biết thêm thông tin về đối tượng XMLHttpRequest.

+0

Chỉ tò mò thôi. JavaScript có khả năng gọi API/dịch vụ web trước khi XHR nổi bật vào ngôn ngữ hoặc cho đến thời điểm đó có nghĩa là * chỉ * đối với thao tác DOM trong các trang HTML không? – RBT

2

Bạn có thể sử dụng đối tượng XMLHttpRequest, nhưng vì bạn không muốn sử dụng bất kỳ khung JavaScript nào, bạn sẽ phải sắp xếp và tự sắp xếp các phong bì SOAP.

+1

Bạn chỉ phải lo lắng về phong bì SOAP nếu đó là dịch vụ web SOAP. Một số dịch vụ web an toàn chỉ có thể được gọi và kết quả được đọc mà không cần xử lý trước. – brien

5

Bạn có thể tạo XMLHttpRequest nếu dịch vụ được lưu trữ trong miền của bạn. Nếu không, bạn sẽ có các vấn đề tên miền chéo.

+0

s/có thể/sẽ/nếu tôi không nhầm. –

+0

Vâng, bạn nói đúng. Bất cứ khi nào các công cụ tên miền chéo xuất hiện, tôi nhận được một chút không chắc chắn về những quy tắc chính xác là gì. Tôi chỉ cố gắng tránh những vấn đề đó hoàn toàn;) – brien

+0

Ý của bạn là gì, cụ thể là bởi "các vấn đề liên quan đến tên miền chéo"? –

0

Đồng thời kiểm tra XML HTTP Request để biết trang thông tin tốt đẹp về cách sử dụng đối tượng XmlHttpRequest.

0

Có một thư viện nhỏ được viết bằng javascript có thể được sử dụng làm ứng dụng khách XML-SOAP. Tôi không biết nếu nó hoạt động trên tất cả các trình duyệt nhưng nó có thể giúp bạn ra ngoài. Bạn có thể tìm thấy nó here

0

Điều này đã hiệu quả. Nó cũ (kiểm tra cho Netscape), được viết trước khi tất cả các công cụ Ajax xuất hiện. Bạn phải xử lý các trình duyệt khác nhau - về cơ bản, IE thực hiện theo một cách, và mọi người khác làm theo cách khác.

// javascript global variables 
var soapHeader = '<?xml version=\"1.0\"?>' 
       + '<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"' 
       + ' SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"' 
       + ' xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\"' 
       + ' xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\"' 
       + '>' 
       + '<SOAP-ENV:Header/>' 
       + '<SOAP-ENV:Body>'; 

var soapFooter = '</SOAP-ENV:Body>' 
       + '</SOAP-ENV:Envelope>'; 

var destinationURI = '/webservices/websalm'; 

var actionURI = ''; 

function callWebService(nsCallback,ieCallback,parms) { 
    try 
    { 
     // Create XmlHttpRequest obj for current browser = Netscape or IE 
     if (navigator.userAgent.indexOf('Netscape') != -1) 
     { 
      SOAPObject = new XMLHttpRequest(); 
      SOAPObject.onload = nsCallback; 
     } else { //IE 
      SOAPObject = new ActiveXObject('Microsoft.XMLHTTP'); 
      SOAPObject.onreadystatechange = ieCallback; 
     } 

     SOAPObject.open('POST', destinationURI, true); 

     // Set 2 Request headers, based on browser 
     if (actionURI == '') { 
      SOAPObject.setRequestHeader('SOAPAction', '\"\"'); 
     } else { SOAPObject.setRequestHeader('SOAPAction', actionURI); 
     } 

     SOAPObject.setRequestHeader('Content-Type', 'text/xml'); 

     // Compose the Request body from input parameter + global variables 
     var requestBody = soapHeader + parms + soapFooter 

     // Send, based on browser 
     if (navigator.userAgent.indexOf('Netscape') != -1) 
     { 
     SOAPObject.send(new DOMParser().parseFromString(requestBody,'text/xml')); 
     } else { 
     SOAPObject.send(requestBody); 
     } 
    } catch (E) 
    { 
    alert('callWebService exception: ' + E); 
    } 
} 
+0

Chỉ tò mò thôi. JavaScript có khả năng gọi API/dịch vụ web trước khi XHR nổi bật vào ngôn ngữ hoặc cho đến thời điểm đó có nghĩa là * chỉ * đối với thao tác DOM trong các trang HTML không? – RBT

Các vấn đề liên quan