Worklight HTTP 适配器 - 简单的 Web 服务示例问题

Posted

技术标签:

【中文标题】Worklight HTTP 适配器 - 简单的 Web 服务示例问题【英文标题】:Worklight HTTP Adapter - Simple Webservice Example Problems 【发布时间】:2014-07-02 10:29:33 【问题描述】:

我正在尝试通过 HTTP 适配器进行非常简单的 Web 服务调用,但失败了。我一定错过了一些非常简单的东西。

我想使用这个示例服务:

http://www.webservicex.net/geoipservice.asmx 我在上述服务的 WSDL 上使用 Worklight 的“发现后端服务”工具来生成 HTTP 适配器代码。我部署适配器,然后右键单击 - 运行方式 - 调用 Worklight 过程。在参数区域,我输入(带引号):

“173.194.34.178”

最初,我收到关于 HTTP 标头中没有 SOAPAction 的错误,因此我对 Adapter -impl.js 进行了编辑以手动添加 SOAPAction:

function invokeWebService(body, headers)

    var soapActionHeader = '"http://www.webservicex.net/GetGeoIP"';

    var input = 
        method : 'post',
        returnedContentType : 'xml',
        path : '/geoipservice.asmx',
        headers : 'soapAction' : soapActionHeader,
        body: 
            content : body.toString(),
            contentType : 'text/xml; charset=utf-8'
        
    ;

    //Adding custom HTTP headers if they were provided as parameter to the procedure call 
    headers && (input['headers'] = headers);

    return WL.Server.invokeHttp(input);

这解决了 SOAPAction 问题,但再次使用 Invoke Worklight Procedure 会导致:

"faultstring": "System.Web.Services.Protocols.SoapException:服务器无法处理请求。---> System.ArgumentNullException:值不能为空。\n参数名称:在 System.Text 处输入\n。 RegularExpressions.Regex.IsMatch(String input)\n at WebserviceX.Service.Adapter.IPAdapter.CheckIP(String IP)\n at WebserviceX.Service.GeoIPService.GetGeoIP(String IPAddress)\n --- 内部异常堆栈跟踪结束---"

几乎就像 IP 地址实际上并没有在出站消息中结束。

我是否在“调用 Worklight 过程”对话框中正确输入了参数?这是对话框图像的链接:

https://picasaweb.google.com/lh/photo/t_BpwCVgPmiSpgKld5kMOtMTjNZETYmyPJy0liipFm0?feat=directlink

【问题讨论】:

看看你的其他问题的回答是否对这种情况也有帮助:***.com/a/24530329/1276624 非常感谢 - 它确实有助于构建 JSON。我可以问一些与服务属性对话框相关的问题吗?当我使用 Discover Back End Services 工具时,它会生成适配器并给它一个通用名称 - SoapAdapter1。它还将条目放入服务节点。我将适配器重命名为更合适的名称,但服务属性对话框的适配器名称仍为 SoapAdapter1。不是一点问题,但是每次我进行构建时,它都会重新创建一个名为 SoapAdapter1 的新适配器,除非我删除了服务条目。我可以在某个地方更改它吗? 目前无法为生成的适配器生成唯一名称。从阅读编辑后的问题来看,这似乎已经解决了——您介意将您的解决方案写成问题的答案吗? 【参考方案1】:

在遵循此处和我的其他线程中的一些建议后,我开始研究正在生成的 SOAP。我将 WSDL 塞进了soapUI,下面是一些绝对有效的 SOAP:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.webservicex.net/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:GetGeoIP>
         <web:IPAddress>173.194.34.178</web:IPAddress>
      </web:GetGeoIP>
   </soapenv:Body>
</soapenv:Envelope>

如果我破解我的 HTTP 适配器以接受字符串参数,并将这个肥皂串在一起,它就可以工作。但是,这意味着我已经删除了所有 JSON 行为。因此,我尝试使用 JSON 参数结构来获得相同的 SOAP(通过适配器中所有自动生成的工作灯内容,例如 buildBody 和 jsonToXML):

var params = 
        "GetGeoIP" : 
            "IPAddress" : "173.194.34.178"                  
        ,          
;

var headers = 
        "SOAPAction": "http://www.webservicex.net/GetGeoIP"
;

我向适配器添加了一些日志记录,并关键地更改了命名空间定义:

soapEnvNS = 'http://www.w3.org/2003/05/soap-envelope';
var request = buildBody(params, 'xmlns="http://www.webservicex.net/"', soapEnvNS);

WL.Logger.debug(request);    

return invokeWebService(request, headers);

...它现在生成的肥皂如下所示:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Body>
    <GetGeoIP xmlns="http://www.webservicex.net/">
      <IPAddress>173.194.34.178</IPAddress>
    </GetGeoIP>
  </soap:Body>
</soap:Envelope>

这对服务来说足够好,我得到了很好的回应!

【讨论】:

以上是关于Worklight HTTP 适配器 - 简单的 Web 服务示例问题的主要内容,如果未能解决你的问题,请参考以下文章

调用 Worklight 适配器 http 错误

从非 Worklight 应用程序调用 Worklight 适配器

Worklight HTTP 适配器不适用于 Kerberos

IBM Worklight Http 适配器

无法通过 Android 设备中的 Worklight http 适配器连接到后端

Worklight HTTP 适配器与 Ajax 请求