标签: soap-client

如何生成PHP soap客户端代码?

有没有办法从WSDL文件生成PHP Soap客户端?

我的意思是这样wsdl.exesvcutil.exe在.NET中,对于一类生成的代码可以是服务,而不是像的客户:

$WSDL     = new SOAP_WSDL($wsdl_url); 
$client   = $WSDL->getProxy(); 
Run Code Online (Sandbox Code Playgroud)

我的问题是我希望PHP客户端能够使用服务,即使该服务没有公开其WSDL.

php soap wsdl soap-client

8
推荐指数
3
解决办法
4万
查看次数

SoapClient:如何传递多个具有相同名称的元素?

我有以下代码:

$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)

提前致谢!

php soap soap-client

8
推荐指数
3
解决办法
1万
查看次数

BasicHttpBinding和CustomBinding/Soap11有什么区别?

我们第一次在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网络服务,那么任何建议都会有所帮助.

谢谢!

sap wcf soap soap-client wcf-binding

8
推荐指数
1
解决办法
6110
查看次数

TLS v1.2密码在PHP NUSOAP SoapClient中使用

我想连接到仅支持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 soap-client nusoap tls1.2

8
推荐指数
1
解决办法
2200
查看次数

SoapVar和SoapParam有什么区别?

在PHP中,我们有SoapVarSoapParam类.我已经困惑了很长时间,因为在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)

这实在是直观的,因为SoapVarSoapParam类的名称不太多发言权.通过更优雅可以实现相同的结果:

$response = $soapClient->DoSomething(
    new SoapVar(
        (object) ['Foo' => 'bar'],
        null,
        'TypeName',
        null,
        'TagName'
    )
);
Run Code Online (Sandbox Code Playgroud)

那么目的是SoapParam什么?它只是更简单的版本SoapVar吗?看起来这两个人很困惑并被误解了很多.是否附加了额外的行为SoapParam

php soap soap-client

8
推荐指数
1
解决办法
1617
查看次数

Axis安全标头

您好试图在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)

java soap axis2 header soap-client

7
推荐指数
1
解决办法
2万
查看次数

UPS测试跟踪号码(有这样的事吗?)

我终于让UPS跟踪API工作了.或者至少我想我做到了.它给了我一个"无效的跟踪号码"回复.我现在的问题是我没有要跟踪的软件包.有没有人知道允许我测试来自UPS的假订单的任何资源,或任何会给出回复的东西?谢谢

我正在使用UPS Tracking Developers Kit并需要包装resposnes.

api soap ups soap-client

7
推荐指数
3
解决办法
2万
查看次数

PHP SoapClient和读取属性

我已经找到了很多关于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.

php attributes get soap-client

7
推荐指数
1
解决办法
1284
查看次数

SoapClient尝试获取模式文件时出现401身份验证错误

我的应用程序通常连接到第三方服务器以通过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)

我已经打了一会儿反对这一点,据我所知,问题是两件事之一:

  1. 当我在浏览器中(在浏览器身份验证之后)将该架构URL加载302 redirectshttpsURL(并删除端口声明)时.尝试导入架构时,SOAP调用是否可能不遵循重定向?
  2. 鉴于错误消息是401错误 - 在尝试导入架构时SOAP调用是否可能没有传递凭据?模式文件需要与WSDL文件相同的身份验证,但是在尝试导入时服务器可能没有将身份验证扩展到模式?

假设这是第二个问题,有没有办法可以强制系统使用不同的架构URL而无需下载WSDL文件,编辑它,并在本地存储/引用它?如果是这样,我可以尝试传递URL(http://username:password@domain....)中的凭据?

如果我唯一的目的是创建WSDL和XSD模式文件的修改副本,那么就这样吧,但是我很想知道是否有人有任何想法可以让我避免这种情况(因为模式确实从时间变化 - 到时间).

php xsd soap soap-client

7
推荐指数
1
解决办法
3299
查看次数

自定义服务异常被抛出为AxisFault

我们有一个从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 ,其中类名被设置为字符串以供稍后通过反射使用.

java soap axis2 web-services soap-client

7
推荐指数
1
解决办法
713
查看次数

标签 统计

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