有没有办法从WSDL文件生成PHP Soap客户端?
我的意思是这样wsdl.exe或svcutil.exe在.NET中,对于一类生成的代码可以是服务,而不是像的客户:
$WSDL = new SOAP_WSDL($wsdl_url);
$client = $WSDL->getProxy();
Run Code Online (Sandbox Code Playgroud)
我的问题是我希望PHP客户端能够使用服务,即使该服务没有公开其WSDL.
我有以下代码:
$telnums = array(10, 20, 30);
$obj = new StdClass();
$obj->telnums = new StdClass();
foreach ($telnums as $telnum) {
$obj->telnums = $telnum;
}
call_user_func(array($this->client, 'createDomain'), new SoapVar($obj, SOAP_ENC_OBJECT));
Run Code Online (Sandbox Code Playgroud)
$ this-> client是SoapClient类的一个实例.
它会生成以下请求:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="...">
<SOAP-ENV:Body>
<ns1:createDomain>
<createDomainRequest>
<telnums>30</telnums>
</createDomainRequest>
</ns1:createDomain>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
但是我需要
<createDomainRequest>
<telnums>10</telnums>
<telnums>20</telnums>
<telnums>30</telnums>
</createDomainRequest>
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
PS:PHP 5.2.6-3ubuntu4.5与Suhosin-Patch 0.9.6.2(cli)(内置:2010年1月6日22:25:33)
提前致谢!
我们第一次在SOAP 1.1上使用SAP NetWeaver Web服务,该服务需要通过HTTPS进行用户名和密码身份验证.
我目前正在对WCF应用程序进行原型设计,并且我成功地使用这两种绑定配置来使用SAP Web服务.
<basicHttpBinding>
<binding name="SapEndpoint">
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
<customBinding>
<binding name="SapSoap11Endpoint">
<textMessageEncoding messageVersion="Soap11" />
<httpsTransport authenticationScheme="Basic" />
</binding>
</customBinding>
Run Code Online (Sandbox Code Playgroud)
只要它提供所需的功能,我倾向于使用标准绑定而不是自定义绑定.但我想了解它使用一个绑定或另一个绑定会有什么不同.
如果您之前曾使用过SAP网络服务,那么任何建议都会有所帮助.
谢谢!
我想连接到仅支持TLS 1.2的服务器.我可以指定哪些可能的密码来在PHP NUSOAP SoapClient创建中传输上下文?
<?php
$objSoapClient = new SoapClient(
"https://example.com/?wsdl",
array(
"encoding"=>"ISO-8859-1",
"stream_context"=>stream_context_create(
array(
"ssl"=>array("ciphers"=>"<????>")
)
)
)
);
?>
Run Code Online (Sandbox Code Playgroud) 在PHP中,我们有SoapVar和SoapParam类.我已经困惑了很长时间,因为在php.net上没有相应的文档.
今天我很惊讶地发现这些行将在XML输入中产生完全相同的结果:
$soapVar = new SoapVar((object) ['Foo' => 'bar'], null, null, null, 'TagName');
$soapParam = new SoapParam((object) ['Foo' => 'bar'], 'TagName');
Run Code Online (Sandbox Code Playgroud)
在大多数SoapClient教程中,每当有人想要设置自定义时,我都会看到SoapParam里面的片段:SoapVarxsi:type
$response = $soapClient->DoSomething(
new SoapParam(
new SoapVar(
(object) ['Foo' => 'bar'],
null,
'TypeName'
),
'TagName'
)
);
Run Code Online (Sandbox Code Playgroud)
这实在是直观的,因为SoapVar和SoapParam类的名称不太多发言权.通过更优雅可以实现相同的结果:
$response = $soapClient->DoSomething(
new SoapVar(
(object) ['Foo' => 'bar'],
null,
'TypeName',
null,
'TagName'
)
);
Run Code Online (Sandbox Code Playgroud)
那么目的是SoapParam什么?它只是更简单的版本SoapVar吗?看起来这两个人很困惑并被误解了很多.是否附加了额外的行为SoapParam?
您好试图在Java Axis2客户端程序中以格式生成安全标头.
<soapenv:Header>
<wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext>
<wsse:UsernameToken>
<wsse:Username>myUsername</wsse:Username>
<wsse:Password>myPassword</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)
使用以下代码
SOAPHeaderElement wsseSecurity = new SOAPHeaderElement(new PrefixedQName("http://schemas.xmlsoap.org/ws/2002/04/secext","Security", "wsse"));
MessageElement usernameToken = new MessageElement("", "wsse:UsernameToken");
MessageElement username = new MessageElement("", "wsse:Username");
MessageElement password = new MessageElement("", "wsse:Password");
username.setObjectValue(myProps.getProperty("username"));
usernameToken.addChild(username);
password.setObjectValue(myProps.getProperty("password"));
usernameToken.addChild(password);
wsseSecurity.addChild(usernameToken);
BookingPort bp = bsl.getBooking();
((Stub) bp).setHeader(wsseSecurity);
Run Code Online (Sandbox Code Playgroud)
不幸的是,它并没有产生我想要的东西而且我得到了.
<soapenv:Header>
<wsse:Security soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext">
<wsse:UsernameToken xmlns:wsse="">
<wsse:Username xmlns:wsse="">myUsername</wsse:Username>
<wsse:Password xmlns:wsse="">myPassword</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)
另一端的服务似乎没有处理额外的位,导致错误
faultDetail:
{http://xml.apache.org/axis/}stackTrace:com.ctc.wstx.exc.WstxParsingException: Non-default namespace can not map to empty URI (as per Namespace 1.0 # 2) …Run Code Online (Sandbox Code Playgroud) 我终于让UPS跟踪API工作了.或者至少我想我做到了.它给了我一个"无效的跟踪号码"回复.我现在的问题是我没有要跟踪的软件包.有没有人知道允许我测试来自UPS的假订单的任何资源,或任何会给出回复的东西?谢谢
我正在使用UPS Tracking Developers Kit并需要包装resposnes.
我已经找到了很多关于SoapClient如何期望你在请求中设置属性的解释,但是我找不到从响应中读取属性的方法.
例如,我的SoapClient响应中包含以下元素:
...
<ns:index>
<ns:uid expdate="2013-09-03 14:30:00">JOWtest002</ns:uid>
<ns:uid expdate="2013-02-07 15:00:00">JOWtest003</ns:uid>
</ns:index>
...
Run Code Online (Sandbox Code Playgroud)
但是,"expdate"属性永远不会附加到"index"stdClass
["index"]=>
object(stdClass)#80 (1) {
["uid"]=>
array(2) {
[0]=>
string(10) "JOWtest002"
[1]=>
string(10) "JOWtest003"
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用SoapClient类映射将其绑定到对象,但遗憾的是,WSDL没有将"uid"元素定义为complexType,因此它也不映射属性.将"索引"本身绑定到类不起作用.
有什么建议?我真的想避免通过将XML提供给SimpleXML或DOMDocument来解析XML.
我的应用程序通常连接到第三方服务器以通过SOAP/WSDL获取数据:
$this->soap_client = new SoapClient("https://[the-domain]:443/[path]?wsdl", array(
'trace'=>1,
'login'=>$this->username,
'password'=>$this->password,
'exceptions' => true,
'cache_wsdl' => WSDL_CACHE_NONE
)
Run Code Online (Sandbox Code Playgroud)
去年一切都很好,但他们最近更新了他们的WSDL文件,现在当应用程序尝试连接时,我收到以下两个错误:
SoapClient::SoapClient(http://[the-domain]:80/[path]?xsd=1): failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized
和
SoapClient::SoapClient(): I/O warning : failed to load external entity "http://[the-domain]:80/[path]?xsd=1"
当我查看WSDL XML文件时,看起来违规的可卸载文件是它试图导入的文档模式文件(schemaLocation):( 来自WSDL :)
<types>
<xsd:schema>
<xsd:import namespace="[irrelevant]" schemaLocation="http://[the-domain]:80/[path]?xsd=1"/>
</xsd:schema>
</types>
Run Code Online (Sandbox Code Playgroud)
我已经打了一会儿反对这一点,据我所知,问题是两件事之一:
302 redirects到httpsURL(并删除端口声明)时.尝试导入架构时,SOAP调用是否可能不遵循重定向?假设这是第二个问题,有没有办法可以强制系统使用不同的架构URL而无需下载WSDL文件,编辑它,并在本地存储/引用它?如果是这样,我可以尝试传递URL(http://username:password@domain....)中的凭据?
如果我唯一的目的是创建WSDL和XSD模式文件的修改副本,那么就这样吧,但是我很想知道是否有人有任何想法可以让我避免这种情况(因为模式确实从时间变化 - 到时间).
我们有一个从SOAP Web服务读取的Axis2客户端; 使用WSDL2JAVA生成新的客户端存根类并重命名其包时出现问题.生成工具本身不会导致问题,但WSDL2JAVA没有为所有类重命名包,所以我必须自己做.
有没有想过为这些类重命名包的最佳方法,没有问题?比如以聪明的方式做一个String替换?
在某些情况下,Web服务会抛出业务异常,并且它们会被调用代码直接捕获,但这不再发生,而不是SPECIALException,客户端现在捕获AxisFault.
您可以在下面看到XML响应:
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>Exception message, due to business error.</faultstring>
<detail>
<ns2:SPECIALException
xmlns:ns2="http://com.bla.com/common/exception/xsd/2008/08">
<ns2:code>7</ns2:code>
<ns2:message>Exception message, due to business error.</ns2:message>
</ns2:SPECIALException>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
更详细地检查这一点,差异可能是由于生成的Bla ServiceStub类中的方法populateFaults ,其中类名被设置为字符串以供稍后通过反射使用.
soap-client ×10
soap ×8
php ×6
axis2 ×2
java ×2
api ×1
attributes ×1
get ×1
header ×1
nusoap ×1
sap ×1
tls1.2 ×1
ups ×1
wcf ×1
wcf-binding ×1
web-services ×1
wsdl ×1
xsd ×1