我正在尝试并且失败,通过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
答案 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>
这对于服务来说已经足够好了,我得到了很好的回复!