当前位置: 首页 > 知识库问答 >
问题:

使用基于WSDL的SOAP::Lite

子车俊材
2023-03-14

我是SOAP::Lite的新手,正在尝试快速入门。我有一个支持SOAP的JAMA服务器(需求收集应用程序),我正在查看它的WSDL。

我需要的SOAP::Lite信息在WSDL中可用吗(特别是代理和命名空间/uri)?

WSDL包含以下内容:

<wsdl:definitions xmlns:ns1="http://v3.ws.contour.jamasoftware.com/"
  xmlns:ns2="http://cxf.apache.org/bindings/xformat"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:tns="http://v3.ws.contour.jamasoftware.com"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ContourSoapServiceV3"
  targetNamespace="http://v3.ws.contour.jamasoftware.com">
<wsdl:import
  location="http://MYSERVER/jama/ws/v3/soap/ContourSoapService?wsdl=ContourSoapService.wsdl"
  namespace="http://v3.ws.contour.jamasoftware.com/"/>
<wsdl:binding name="ContourSoapServiceV3SoapBinding" type="ns1:ContourSoapService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
And a little later on...
<wsdl:operation name="getProjects">
  <soap:operation soapAction="getProjects" style="document"/>
  <wsdl:input name="getProjects">
    <soap:body use="literal"/>
  </wsdl:input>
  <wsdl:output name="getProjectsResponse">
    <soap:body use="literal"/>
  </wsdl:output>
</wsdl:operation>

作为将来的参考,我确实让它大部分工作正常,下面是代码:

my $soap = SOAP::Lite
  -> proxy('http://MYSERVER/jama/ws/v3/soap/ContourSoapService')
  -> uri('http://v3.ws.contour.jamasoftware.com');
print "Soap is $soap\n";
# Soap is SOAP::Lite=HASH(0x7fdc24e3fb70)

我运行的PERL代码是:

my $service = SOAP::Lite->service('http://MYSERVER/jama/ws/v3/soap/ContourSoapService?wsdl');
print "service is $service\n";
# This says service is ContourSoapServiceV3=HASH(0x7fd244804678) which is happy
# But then I can't figure out what to do with $service
my %hash = %$service;
foreach my $key (keys %hash )
{
   print "key $key\n";
}
# service is ContourSoapServiceV3=HASH(0x7f8c8bf342f8)
# key _packager
# key _transport
# key _on_fault
# key _on_nonserialized
# key _deserializer
# key _on_action
# key _autoresult
# key _schema
my $schema = $service->_schema();
print "schema is $schema\n";
# Unrecognized method '_schema'. List of available method(s):
# getDownstreamRelationships getRelationshipsForProject addAttachmentToItem
# signBaseline clearSuspectLinksForItem deactivateProject
# and eventually:
# getVersion
# and then many more
print "Version is " . $service->getVersion(3, 6) . "\n";
# Use of uninitialized value in concatenation (.) or string at ./JamaItems.perl line 66.

# And if I bypass the $service it's no better:
print "Version is " . SOAP::Lite
  -> proxy('http://MYSERVER/jama/ws/v3/soap/ContourSoapService')
  -> uri('http://v3.ws.contour.jamasoftware.com')
  -> getVersion(3, 6)
  -> result . "\n";
# Use of uninitialized value in concatenation (.) or string at ./JamaItems.perl line 70.

我传递给getVersion()的参数肯定是错误的,这是否足以导致函数不返回任何内容?我原以为它至少会给我一些错误。。。

共有2个答案

邹书
2023-03-14

我发现了神奇的命令:

$soap->outputxml('true');

现在我可以看到,当我用一个无效参数调用getProjects()函数时,它实际上是在与服务器对话,并得到一个错误:

my $soap = SOAP::Lite
  -> proxy('http://MYSERVER/jama/ws/v3/soap/ContourSoapService')
  -> uri('http://v3.ws.contour.jamasoftware.com');
print "Soap is $soap\n";
# Soap is SOAP::Lite=HASH(0x7fdc24e3fb70)

my $projects = $soap->getProjects(3);
print "Projects are $projects\n\n";
# Projects are <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
# <soap:Body><soap:Fault>
#   <faultcode>soap:Server</faultcode>
#   <faultstring>Access control</faultstring>
# </soap:Fault></soap:Body></soap:Envelope>

因此,即使WSDL在学习参数应该是什么方面没有帮助,文档中说它是一个WsAuth对象,所以现在我只需要弄清楚如何创建其中一个。

贺季
2023-03-14

我用肥皂::精简版和一个。NET Web服务(*. asmx格式)。Web服务提供了一个WSDL,但这不是我在代码中引用的。

  my $soap = SOAP::Lite
    -> uri('http://myserver')
    -> on_action( sub { join '/', 'http://myserver', $_[1] } )
    -> proxy('http://myserver/services/GetEmailAddress/Service.asmx');

  my $method = SOAP::Data->name('GetEmailAddress')
    ->attr({xmlns => 'http://myserver/'});

  my @params = ( SOAP::Data->name(username => "someusername") ); 
  my $email = $soap->call($method => @params)->result;

我从那里学到的一切https://msdn.microsoft.com/en-us/library/ms995764.aspx.不确定这是否会对您有所帮助,因为您可能没有asmx格式的web服务,但可能会!

 类似资料:
  • 我已经用soap请求启动了一个新项目,我遵循了一些关于它的教程,但它并没有像它应该做的那样好。 我将这部分代码用于请求: 它给了我这个错误: SoapFault异常:[HTTP]不支持的媒体类型堆栈跟踪: 所有参数的类型都可以根据我得到的留档。和php部分似乎可以对我和我找到的所有教程。 我想知道这是否是头部问题或类似的问题。 WSDL在[这里](https://smarteye.ariadnex

  • 问题内容: 是否有任何软件包可以在Go上支持 SOAP / WSDL ? 问题答案: 不。 SOAP很烂,但是我必须实现一个使用SOAP的已经定义好的协议的服务器,因此我使用进行监听并使用对其进行了解码/编码。几分钟后,我已经将Go的第一个信封送达了。

  • 请原谅我对肥皂不太熟悉。我的任务是将通过第三方供应商的SOAP API提供给我们的多个pdf文件保存到我们的Web服务器上。供应商API的结果提供如下 我已经做到了这样一个地步:我可以用php将pdf输出到浏览器,而不需要使用以下代码: 我根据结果的base64Binary类型假设需要base64_decode。结果只剩下一堆符号。我尝试将结果转换为字符串,然后保存到PDF。这让我更接近了,因为至

  • 我使用apache cxf创建了一个肥皂网络服务,当我发布我的网络服务时,我得到了一个没有复杂类型部分的WSDL,这是我的代码: 我的Interafce: 我的配置: 我的请求对象: 这是生成的WSDL: 为什么在生成的WSDL中找不到像“referenceNumber”这样的请求属性

  • 让我画出场景以便更好地理解&以我的理解 我手上的东西 web url() 2个WSDL链接 ==>https:.../schemas/informationservice.wsdl ==>https:.../schemas/orderuploadservice.wsdl 过程“请求的MethodRequest”不存在。 函数“请求的方法”不存在。 参见输出 或者有时(通过注释一些其他选项或修改ur

  • 我试图从服务创建一个基于WSDL的代理。此服务运行在tomcat服务器中,该服务器已配置为只接受使用TLSV1.2的安全连接。并且该服务在运行wso2server的intranet之外。 当我测试基于wsdl的代理模板中的wsdl uri时,问题就会出现,并启动系统以下警报:“无效的wsdl uri(无法建立连接)”。我不得不说,wso2esb与外部有连接,问题不在于访问这个url,因为: nul