【问题标题】:Worklight HTTP Adapter - Simple Webservice Example ProblemsWorklight HTTP 适配器 - 简单的 Web 服务示例问题
【发布时间】: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

【问题讨论】:

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

标签: ibm-mobilefirst worklight-adapters


【解决方案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>

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

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 2014-09-22
    • 1970-01-01
    • 2015-10-25
    • 2016-01-03
    • 1970-01-01
    • 2014-01-17
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多