【问题标题】:PHP SoapClient with Proxy: How to access schema over proxy?带代理的 PHP SoapClient:如何通过代理访问架构?
【发布时间】:2016-06-29 11:51:39
【问题描述】:

使用代理选项初始化 SoapClient 类时,可以通过代理正确访问 WSDL 及其方法:

$client = new SoapClient(
    WSDL_URL, 
    array(
        'proxy_host'     => PROXY_HOST,
        'proxy_port'     => PROXY_PORT
    )
);

但是没有通过指定的代理访问架构 (schemaLocation):

<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified">
    <xs:import namespace="http://example.com/webservice/cisbase" schemaLocation="http://example.com/ws/cis_base.xsd"/>
    <xs:import namespace="http://de.ws.example" schemaLocation="http://example.com/ws/is_base_de.xsd"/>
</xs:schema>

这导致:

SOAP-ERROR: Parsing Schema: can't import schema from ...

所以基本上 SoapClient 正在尝试访问 cis_base.xsdis_base_de.xsd 而没有代理失败。

PHP SoapClient 出现这种行为是否有原因?是否有解决方法?

【问题讨论】:

    标签: php soap proxy xsd soap-client


    【解决方案1】:

    在我的代码中,我使用了这些选项,并且与我们的代理和 https 协议配合得很好。我希望这对你有用:)

            'proxy_host' => PROXY_HOST, 
            'proxy_port' => PROXY_PORT,
            'stream_context' => stream_context_create(
                array(
                    'ssl' => array(
                        'verify_peer'       => false,
                        'verify_peer_name'  => false,
                    )
                )
            )
    

    问候。

    【讨论】:

    • 谢谢,但我们对 https 没有任何问题。我们的问题是没有代理访问 WSDL 模式。
    【解决方案2】:

    试试:

    $client = new SoapClient(
        WSDL_URL, 
        array(
            'proxy_host'     => PROXY_HOST,
            'proxy_port'     => PROXY_PORT,
            'stream_context' => stream_context_create(
                array(
                    'proxy' => "tcp://$PROXY_HOST:$PROXY_PORT",
                    'request_fulluri' => true,
                )
            ),
        )
    );
    

    您可能想检查PHP documentation 中的其他可能参数。

    【讨论】:

    • 警告:stream_context_create():选项的格式应为 ["wrappername"]["optionname"] = $value
    • @Ste,尝试添加协议包装器,例如。对于 HTML:stream_context_create(array('http'=&gt;array('proxy' =&gt; "tcp://$PROXY_HOST:$PROXY_PORT", 'request_fulluri' =&gt; true,)))。请参阅 PHP 文档中的示例。
    猜你喜欢
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多