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

使用php、SOAP和WSDL的正确步骤是什么?

毕魁
2023-03-14

让我画出场景以便更好地理解&以我的理解

我手上的东西

  • web url( .asmx )
  • 2个WSDL链接
    • ==>https:.../schemas/informationservice.wsdl
    • ==>https:.../schemas/orderuploadservice.wsdl
      $x = new SoapClient(<wsdlink>, [
                                    // 'local_cert' => '<cert>.pem',
                                    // 'allow_self_signed' => true,
                                    // 'cache_wsdl' => WSDL_CACHE_NONE,
                                    'location' =>'https://192.168.xx.xx/wsdl/try.php',
                                    'uri' =><other_wsdlink>,
                                    'passphrase' => $passphrase,
                                    'exceptions' => false,
                                    'trace' => true,
                                    'soap_version' => SOAP_1_1
                                    //'connection_timeout'=>2000,
                                    //'encoding'=> 'ISO-8859-1' // 'UTF-8'
                                ]);
    
    • 过程“请求的MethodRequest”不存在。
    • 函数“请求的方法”不存在。

    参见输出

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
    <faultcode>SOAP-ENV:Server</faultcode>
    <faultstring>Procedure 'requestedMethodRequest' not present</faultstring>
    </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    

    或者有时(通过注释一些其他选项或修改uri)

    <SOAP-ENV:Envelope>
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <faultcode>SOAP-ENV:Server</faultcode>
            <faultstring>Function 'requestedMethod' doesn't exist</faultstring>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body></SOAP-ENV:Envelope>
    
    Array
    (
    [0] => firstFunctionWithoutParam
    [1] => secondFunctionWithoutParam
    [2] => requestedMethodResponse RequestedMethod(requestedMethodRequest $messagePart)
    [3] => secondFunctionClassParam
    )
    
      - Unable to set private key file <cert>.pem
      - failed to create an SSL handle
      - Failed to enable crypto
      - (<wsdlink>):failed to open stream: operation failed
      - I/O warning : failed to load external entity <wsdlink>
    
        ini_set('soap.wsdl_cache_enabled',0);
        ini_set('soap.wsdl_cache_ttl',0);
    

    >

  • 是否需要在构造函数中同时设置SOAPClientSOAPServer

    我需要为证书文件设置一些额外的规则吗?

    $URI选项执行什么操作(这是必需的)以及发送请求或

    这是证书问题还是可能是系统或网络问题(Ubuntu14.04),如果是,如何检查?

    更改许可证书

     openssl pkcs12 -in certificatefile.PFX -out certfile.pem -nodes -clcerts  
    

    和取消注释cert选项,并注释__doRequest方法中的所有preg_replace代码

    <?xml version="1.0" encoding="utf-8"?>
            <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
              <soap:Body>
                <addressVerificationRequest xmlns="urn:DCNZ.MSP.Wireline.Wholesale.Common">
                  <addressVerification>
                    <samId xmlns="urn:DCNZ.MSP.Wireline.Wholesale.Common">string</samId>
                    ...
                    <postalCode xmlns="urn:DCNZ.MSP.Wireline.Wholesale.Common">string</postalCode>
                  </addressVerification>
                </addressVerificationRequest>
              </soap:Body>
            </soap:Envelope>;
    
    <?xml version="1.0" encoding="UTF-8"?>  
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:DCNZ.MSP.Wireline.Wholesale.Messages">  
     <SOAP-ENV:Body><ns1:addressVerificationRequest/></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>'
    

共有1个答案

段干庆
2023-03-14

确保在PHP中获得正确类的任何简单方法都是使用https://github.com/wsdl2phpgenerator/wsdl2phpgenerator,它们提供了一个命令行生成器,您可以使用现有的WSDL运行该生成器,它将为所有请求和响应生成一系列PHP类,最重要的是为服务生成一系列PHP类。

在调用webservice的类中,您可以执行以下操作:

// Construct the service
$service = new Service();
// Construct the request
$request = new RequestMethod();
$request->element = "test";
// Call the function
$response = $service->callRequest($request);
// process response
die(var_dump($response));

如果您正在使用框架之类的东西,您可能必须重构生成的类,但它给了您一个很好的起点。

 类似资料:
  • 我在尝试连接magento v2时遇到此错误。0.2 SOAP API。 我正在本地主机上运行 我尝试了大多数解决方案,但没有一个奏效。 安装SOAP ssl存在于php.ini文件 在文件中获取内容不返回任何内容

  • 问题内容: 我已经获得了WSDL文件,并且需要通过Internet使用此WSDL文件使用Web服务。我需要在Java中执行此操作。 有人可以告诉我这样做的步骤吗?我还要感谢一些有用的链接。 问题答案: 第一步是生成可以与此Web服务对话的类。看一下Axis2之类的开源解决方案。这将为您生成存根,以便您以代码与Web服务进行对话……然后,由您决定使用此服务。

  • 那么,回到问题上来,鉴于微软建议不要在新的开发中使用WebRequest而是使用只提供异步API的HttpClient,我该怎么办呢? 这是我正在做的一些伪代码... 如何实现ProcessStuff()?

  • 我对SOAP响应有问题,希望有人能帮助我。 当SOAP响应被SOAP::Lite模块反序列化时,我认为出了问题。在SOAP-响应中有一些“正常”节点和被引用的节点。但它不正确的反序列化。 SOAP响应: 结果哈希的转储: Perl代码:

  • 我是SOAP::Lite的新手,正在尝试快速入门。我有一个支持SOAP的JAMA服务器(需求收集应用程序),我正在查看它的WSDL。 我需要的SOAP::Lite信息在WSDL中可用吗(特别是代理和命名空间/uri)? WSDL包含以下内容: 作为将来的参考,我确实让它大部分工作正常,下面是代码: 我运行的PERL代码是: 我传递给getVersion()的参数肯定是错误的,这是否足以导致函数不返

  • 我正在用Spring Boot构建一个SOAP web服务。一个。wsdl文件是由第三方提供的,我正在用wsdl2java生成Java类。 当使用SoapUI进行测试时,我可以击中我的endpoint。但是,请求总是空的,除非我在SOAPUI中手动修改XML请求。 如何通过修改代码而不更改原始wsdl或XML请求来修复此问题?