65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 JavaScript 调用 WebServices

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.45/5 (5投票s)

2008 年 2 月 12 日

CPOL

8分钟阅读

viewsIcon

165481

downloadIcon

2513

在本教程中,我将展示如何使用 JavaScript 调用 Web 服务、如何写入文件以及如何运行文件。

完成者:Duaa Al-ansari - 约旦。

callWebServiceUsingJavaScript

引言

JavaScript 是互联网上最流行的脚本语言,适用于所有主流浏览器,如 Internet Explorer、Mozilla、Firefox、Netscape 和 Opera。

JavaScript 用于数百万个网页,以增加功能、验证表单、检测浏览器等等。

随着 Web 服务的兴起,就需要使用 JavaScript 来调用 Web 服务。

在本教程中,我将解释以下内容

·         如何使用 JavaScript 调用 Web 服务 API。

·         如何使用 JavaScript 写入文件。

·         如何使用 JavaScript 运行应用程序。

背景

在本教程中,我将调用 Extentrix Web Services 2.0 – Application Edition 的一个 Web 服务,该服务托管供开发人员用于测试问题。该 Web 服务 API 是“launchApplication”。此 Web 服务从 Citrix Presentation Server(在本例中为 Acrobat Reader)获取要打开的应用程序的名称,并返回 ICA 文件的内容。

我将使用 JavaScript 将结果 ICA 文件内容写入文件,然后也使用 JavaScript 运行该文件。

(有关 Extentrix Web Services 2.0 – Application Edition 的更多信息,请访问 http://www.extentrix.com/Web%20Services/Index.htm)。

要求

  1. 任何网页浏览器。
  2. HTML 基础知识。
  3. 安全要求

启用“初始化并脚本化未标记为安全脚本的 ActiveX 控件”选项。对于 Internet Explorer,请执行以下操作

 

A) 在 Internet Explorer 中,转到工具 >> Internet 选项

callWebServiceUsingJavaScript

图 1

B) 选择安全选项卡,转到自定义级别

image003.jpg

图 2

C) 启用“初始化并脚本化未标记为安全脚本的 ActiveX 控件”选项,然后单击确定

image004.png

图 3

使用代码

WebService 行为是一个简单、轻量级的组件,它封装了使用简单对象访问协议 (SOAP) 调用远程方法的能力。此行为使 Microsoft Internet Explorer 5 及更高版本能够直接与 Microsoft .NET WebServices 以及支持 Web 服务描述语言 (WSDL) 1.1 的其他平台、应用程序和服务器进行通信。

使用 WebService 行为,浏览器脚本可以直接访问 Web 服务中的数据,并使用该信息通过 DHTML 动态更新网页。这种新功能极大地改善了浏览体验,并且比传统的需要完整刷新网页的方法更快、更高效。

WebService 行为支持多种数据类型,包括:内置 SOAP 数据类型、数组、对象、对象数组和可扩展标记语言 (XML) 数据。

  有两个主要文件: 

     1. JavaScript_Sample.htm

此页面是本示例中的主页面;它包含一个启动 Acrobat Reader 应用程序的链接。它使用 JavaScript 连接到 Extentrix Web 服务,以启动在 Citrix Presentation Server 上发布的 Acrobat Reader 应用程序,并使用 ICA 客户端。

2. webservice.htc

这是一个 HTML Components (HTC) 文件,它封装了 Web 服务行为。必须启用它才能连接到 Web 服务。您可以从以下链接下载: http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/behaviors/library/webservice/default.asp.

  1. 如何使用 JavaScript 调用 Web 服务 API

    A. 创建超链接 HTML 对象:

 我将把超链接 “ViewLink” 与 Web 服务行为关联。

要使用 “WebService” 行为,必须使用 STYLE 属性将其附加到 HTML 元素,如下所示:

// Create hyper link html object
<a id="ViewLink"   href="http://"  onclick="CallAPI()"  style="behavior:url(webservice.htc);"
 onresult="onmyresult();"> <font color=maroon>Acrobat Reader</font></a>

webservice.htc 应该在同一个工作目录文件夹中。

当您单击此链接时,它会调用 CallAPI() 函数 ( onclick="CallAPI()" ) ,该函数调用所需的 API。结果将通过 onmyresult() 函数 ( onresult="onmyresult();" ) 接收,该函数写入结果 ICA 文件并运行它来启动 Acrobat Reader 应用程序。

    B. 创建 Web 服务连接:

      通过此函数,您可以使用上一个链接来创建到 Extentrix Web 服务的连接。

我使用 getElementById("ViewLink") 函数获取上一步创建的超链接“ViewLink”。

然后,我为附加到“ViewLink”超链接的 Web 服务行为设置 Web 服务描述语言 (WSDL) URL。并使用 useService 方法为 Web 服务设置一个友好名称“Service1”。

useService 方法使我们能够为主机 URL 连接建立一个友好名称,该名称可以从脚本引用,而不是使用长 URL。

在此方法中,我们定义了当“ViewLink”超链接事件发生时将联系的 Web 服务 URL。

我将 useService 方法的调用放在 init() 方法中,该方法将在加载时调用(在 onload 事件处理程序中),您可以直接将其放置在 onload 事件处理程序中。主要目的是确保在“ViewLink”超链接上附加的 Web 服务行为事件发生之前调用此方法。

有关 useService 方法的更多信息,请访问 http://msdn2.microsoft.com/en-us/library/ms531063(VS.85).aspx

 

// creating init() function that calls the webservice:  
 function init()
 {
   service = document.getElementById("ViewLink");
       service.useService("http://www.extentrix.com/webservices/2.0.0/ExtentrixWebServicesForCPS.
       asmx?WSDL","Service1");
 }
// where service is the enabling link in the previous step.

    C. 在页面加载时调用 init() 函数:

     init() 函数将在页面加载时调用。

// calling init() function at page load: 
   <BODY  onload=init();>

    D. 定义我的凭据类:

此类专门针对 Extentrix Web Service 2.0 – Application Edition。不适用于任何通用 Web 服务。因为它是“LaunchApplication”API 参数之一。

当您单击超链接“ViewLink”时,其事件将调用“LaunchApplication”API,该 API 需要您的凭据类实例作为参数。

凭据类包括您的用户名、密码、域、域类型和密码加密方法。此信息特定于拥有 Acrobat Reader 已发布应用程序的 Citrix Presentation Server。

我们通过定义构造函数方法在 JavaScript 中定义类。这将作为类定义被理解。

// Define my credentials class:
   function Credentials(UserName,Password,Domain,Type,Method)
   {
     this.UserName=UserName;
     this.Password=Password;
     this.Domain=Domain;
     this.DomainType=Type;
     this.PasswordEncryptionMethod=Method;
    }

    E. 调用 launchApplication API:

CallAPI(): 当“ViewLink”超链接对象的“onclick”事件发生时(单击超链接时),将调用此函数。

此函数创建您的凭据对象,并设置其成员。凭据已设置为 Extentrix 测试驱动器已发布的 Web 服务。

然后,它调用 launchApplication API,该 API 接受以下参数:应用程序名称、凭据、客户端名称和客户端 IP。

在客户端名称中使用您的机器名称,在客户端 IP 中设置您的机器的 IP。

调用“launchApplication”API 是使用“callService”函数完成的,该函数接受以下参数:API 名称及其参数。

callService() 方法启动 WebService 行为与 Web 服务的交互。其语法如下:

   iCallID = sElementID.sFriendlyName.callService( [oCallHandler], funcOrObj, oParam); 

其中

·   iCallID 是服务调用的返回 ID。对于异步调用,此 ID 应与作为结果对象属性返回的 ID 匹配。只有匹配后,结果对象才能与此服务调用相关联。

·   sFriendlyName 是与 Web 服务关联的友好名称。调用 useService() 方法为您的 Web 服务分配友好名称。

·   oCallHandler 是用于处理结果对象的回调处理程序函数。此参数是可选的。

·   funcOrObj 是以下可能值之一。                    

  strFuncName:一个字符串 ,表示要调用的远程函数的名称。它必须用单引号或双引号括起来。          

  objCall:一个 call 对象,该对象已定义调用远程函数所需的属性。此参数是必需的。

·   oParam 是 Web 服务 API 期望的参数的逗号分隔列表。此参数是必需的。

 

// Calling the API:   
   function CallAPI()
   { 
      var myusername = "citrixdesktop";
      var mypassword = "demo";
      var mydomain = "testdrive";
      var mytype = 0;
      var mymethod = 0; 
            var credentials = new Credentials(myusername,mypassword,mydomain,mytype,mymethod); 
     try
    {
               iCallID = service.Service1.callService("LaunchApplication", "PDFViewer", 
               credentials ,"w2k3-s3","172.19.8.103");  
    }
     catch(e)
    {
        alert(e.message);
     }
   }

  2. 如何使用 JavaScript 写入文件

现在我们可以使用启用链接中的“onresult”属性来接收 API 结果,该链接调用“onmyresult”函数。   

当使用 WebService 行为从远程 Web 服务接收到结果时,onresult 事件会触发。它仅对附加了 WebService 行为的文档中的对象可用。

onresult 事件的事件对象通常在 Result 对象中可用。它包含以下属性:

·   result.id: 返回与 callService() 方法调用的特定实例关联的唯一标识符。

·   result.value: 返回方法调用的值。返回的数据类型取决于服务描述中方法的定义。

·   result.raw: 返回从服务器收到的整个 XML 数据,包括 SOAP 使用时的报文头和信封。

·   result.error: 返回一个布尔值,指定是否发生错误。如果为 true,则方法调用导致错误;如果为 false,则方法调用成功。

   当 result.error 为 true 且 iCallID 等于 event.result.id 时,发生错误。因此,errorDetail 对象将作为结果对象的属性可用。

·   result.errorDetail.code : 一个晦涩的错误代码。可以是 VersionMismatch、MustUnderstand、Client 或 Server。

·   result.errorDetail.string: 一个更具描述性的错误消息。例如:“错误是无效参数。”

·   result.errorDetail.raw: 从服务器接收到的完整 XML 数据包。                                                                                                

否则,如果 API 调用成功,onmyresult() 函数将使用 event.result.value 接收结果 ICA 文件内容,并使用 Scripting.FileSystemObject 将其写入客户端机器上的文件。

在 JavaScript 中编写文件并保存文件有三个步骤:

·   创建新的 Scripting.FileSystemObject 对象,通过 ActiveX。Scripting.FileSystemObject 是 一个 COM 对象,可以通过 ActiveX 脚本任务完全利用该对象 来写入文件。

·   使用 FileSystemObject 对象的 OpenTextFile 方法,并将 ForWriting 标志设置为 true。

  OpenTextFile 是一个接受三个参数的函数:
要写入的文件的路径(必需)。
Iomode 参数,用于决定文件操作(写入使用 2)。
Create 参数可以是 True(如果文件不存在则创建指定文件)或 False(则不创建)。

·   写入数据并关闭文件。

  代码如下所示:

// Catch the result of calling the API:    
   function onmyresult()
   {
     if ((event.result.error)&&(iCallID==event.result.id))
     {
         var xfaultcode = event.result.errorDetail.code;
         var xfaultstring = event.result.errorDetail.string;
         var xfaultsoap = event.result.errorDetail.raw;
         alert("Error");
     }
      Else
      {   
        var icaContent = event.result.value; 
        array = icaContent.split('\n'); 
        var fileName = "c:/content.ica";    
               var Fs = new ActiveXObject("Scripting.FileSystemObject");      
               var Output = Fs.OpenTextFile(fileName,2,true);
        var content = array[0] + "\n";
        for (i = 1; i < array.length; i++)
        {
          content += array[i] + "\n";
        }
 
         Output.write(content);
         Output.close();     

3. 如何使用 JavaScript 运行应用程序

      最后,我们可以使用“WScript.Shell”通过 ICA 客户端运行它。要运行 ICA 文件:

      设置文件 URL。     
     创建一个分配给 WScript.Shell 对象的 ActiveXObject。
    
     使用 run 函数,该函数接受文件 URL 作为参数。

         url = "file:///"+ fileName;
         WSH = new ActiveXObject("WScript.Shell"); 
         WSH.run(url);  
      } 
  } 

© . All rights reserved.