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 应用程序调用 Worklight 适配器
Worklight HTTP 适配器不适用于 Kerberos