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

时间:2014-07-02 10:29:34

标签: ibm-mobilefirst worklight-adapters

我正在尝试并且失败,通过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:Server无法处理请求.---> System.ArgumentNullException:值不能为null。\ n参数名称:输入\ n在System.Text .RegularExpressions.Regex.IsMatch(String input)\ n WebserviceX.Service.Adapter.IPAdapter.CheckIP(String IP)\ n at WebserviceX.Service.GeoIPService.GetGeoIP(String IPAddress)\ n ---内部异常堆栈的结束追踪---“

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

我是否在Invoke Worklight Procedure对话框中正确输入了参数?以下是对话框图像的链接:

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

1 个答案:

答案 0 :(得分:2)

在按照这里和我的其他线程中的一些建议后,我开始研究正在生成的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"
};

我在适配器中添加了一些日志记录,并且CRUCIALLY更改了命名空间定义:

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>

这对于服务来说已经足够好了,我得到了很好的回复!