【问题标题】:PHP Soap - logic, server, and a lot of other problemsPHP Soap - 逻辑、服务器和许多其他问题
【发布时间】:2016-01-29 18:31:45
【问题描述】:

我们有以下场景:

  1. 设置一个 web 服务 - wsdl 和所有,应该监听客户端发送的数据,接收它,用它做一些事情,如果一切正常,发送一个响应为“ok”,如果有什么东西死了,发送一个“false”
  2. 客户端运行一个生成soap/xml请求位的脚本,创建一个soap客户端并将请求发送到wsdl。
  3. 客户端得到一个结果,表明数据没有被 Web 服务处理 - 错误。而且网络服务根本没有收到任何数据。

我无权访问网络服务 - 它是别人的。生成的请求正文(整个等)正在正确生成-当我通过soapUI发送它时它可以工作,但不能通过我的php soap客户端。

我尝试使用带有 SoapClient__doRequest__call 的内置 Soap(尝试了所有方法),但没有任何反应 - 仍然得到 'false' 结果。我尝试重新编写 NuSoap 以使用 Soap 1.2,但对于返回 true 的内容,仍然只有 'false' 结果。

所以,我想知道是否有人可以回答我以下问题:

  1. 我是否需要在服务器上专门安装一些东西才能使其与 Soap 1.2 一起使用?

  2. 当客户端必须向 Web 服务的函数发送数据时,我应该使用 __doRequest 还是 __call?还是别的什么?

  3. 根据我的 php.ini,服务器 header_accept 值没有使用soap 1.2 所需的应用程序/soap+xml - 如果是,这可能是问题 - 回到问题 1,或者我可以将类型添加到 header_accept 吗?

编辑:

$client = new SoapClient(
    "the_wsdl_url_correct_for_sure.wsdl", 
    array(
       'soap_version' => SOAP_1_2, 
       'trace'        => 1,
    )
);

$result = $client->__doRequest(
    $the_var_i_use_to_store_the_soap_xml_thingie_that_works_through_soapUI_so_it_is_correct, $location, 
    $the_function_I_try_to_call, 
    "1.2"
);

对于$location,我是操作的命名空间(我试图调用该函数并将数据从第一个参数发送到)。对于动作/功能,我尝试仅使用在命名空间中定义的动作名称,并使用带有“full_namespace/action”的完整路径

当我尝试将数据发送到 WSDL 时,我应该使用 __doRequest 还是 __call

编辑2:

我发送的请求是:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <env:Header/>
   <env:Body>
      <ns2:FunctionName xmlns:ns2="namespace_of_the_service">
         <arg0>
              <data1>Some data</data1>
           </arg0>
       </ns2:FunctionName>
   </env:Body>
</env:Envelope>

有关此问题的更多信息可以在我之前的帖子中阅读: PHP Soap Client - sending the wrong headers "soapenv:VersionMismatch"

【问题讨论】:

  • 可能有很多原因。我能给出的最佳建议:获取最新的 PHP 版本。使用内置的 SoapClient 类作为初学者,它支持 SOAP 1.2。您很可能提供了错误的论点。您是否处于 WSDL 模式?您的代码在哪里(如果您问我,请在此处使用示例代码坚持 SoapClient)?
  • 不幸的是,我无法访问服务器 - 无法自行重新配置它:/ 我确实使用了内置的 Soap,但它一直给我关于 Soap 版本不匹配的错误,从中我得出结论,它根本不支持 1.2... 或者在此过程中有些东西正在死去。我将在我的主帖中添加我的 soapClient 代码和请求。
  • 如果您收到具体的错误消息,请将其添加到您的问题中。还要启用 SoapClient 类的调试模式,并逐字查看 SOAP 请求和响应。您可能还想将这两个添加到您的问题中。
  • 我已启用此功能,但没有收到任何错误。
  • 请参阅Debugging PHP SOAP call - 它通过启用SoapClienttrace 模式工作,在SoapClient::__getLastResponse 的文档中进行了解释。 - 然后检查 SOAP 通信的请求和响应 XML。

标签: php soap header client


【解决方案1】:

您在此处提出问题的方式不适用于 Stackoverflow,我将其留在这里作为评论,而不是作为答案,只是为了表明您在获得这些答案方面并没有取得太大进展:

  1. 我是否需要在服务器上专门安装一些东西才能让它与 Soap 1.2 一起使用?

    不,带有 Soap 扩展的最新 PHP 版本就足够了。

  2. 当客户端必须向 Web 服务的函数发送数据时,我应该使用 __doRequest 还是 __call?还是别的什么?

    这取决于模式(WSDL 与否)以及您想要做什么。什么是 WSDL 以及什么是 WSDL 模式,请read the whole Soap book in the PHP manual from start to end 以及我建议,因为文档并不完美,您让自己熟悉什么是 WSDL 和一些第三方 WSDL SoapClient 示例,您可以通过互联网搜索引擎找到它们你的选择。对于__doRequest,请参阅手册您可以使用它做什么。对于__call,手册清楚地说明了它的用途和已弃用,因此您可能正在寻找__soapCall

  3. 根据我的 php.ini,服务器 header_accept 值没有使用soap 1.2 所需的应用程序/soap+xml - 如果是的话,这可能是问题 - 回到问题 1,或者我该如何添加header_accept 的类型?

    这可能是根据你的php.ini,我的意思是你可以在那里写你想要的,但是根据 PHP 文档本身没有header_accept PHP ini 指令。请仔细检查 PHP.ini 中写入的内容,然后仔细检查 PHP 手册中该指令的文档,是否它控制您想要控制的内容 - 或者如果已经设置 - 它没有设置可能会妨碍您。

    据我所知,对于 SoapClient,您不需要设置任何基于 PHP ini 的标头接受指令(即使旁边实际上不存在该指令!)即可使其正常工作。它适用于默认配置,因此您无需添加任何内容。

    这让我想知道你为什么要问这个问题?是什么让您认为您需要向该(您未进一步指定的)ini 设置添加任何内容?

【讨论】:

  • 好吧,为了使用 Soap 1.2,发送的标头必须是内容类型 application/soap+xml 而不是 text/xml。我同时使用了 getLastRequestHeaders 和 getLastResponseHeaders,它们都说“内容类型文本/xml”,而在soapUI 中,原始数据显示了两种内容类型的应用程序/soap+xml - 这就是为什么我认为这种类型可能应该包含在服务器接受的标头。
  • 好的,这可能是个问题,但是,不要急于下结论哪个 php.ini 指令可能与此相关。对于您的其余问题,我认为大部分问题都应该通过 PHP 手册进行澄清,所以我不清楚您为什么要问(或具体问什么)。例如__call(重定向到__soapCall)已经说明了它在WSDL模式中的作用(或不是)(你通常不会在WSDL模式中使用它)。
  • 最有可能的错误是$the_var_i_use_to_store_the_soap_xml_thingie_that_works_through_soapUI_so_it_is_correct,因为这个假设可能是完全错误的。 PHP soap 客户端不是soapUI,因此您需要在PHP 中为该SOAP 参数使用正确的soap 类型作为PHP 函数参数。不幸的是,你没有分享具体是什么。您的问题中还缺少具体的 WSDL URI,以及具体的方法名称等,这使得这很难理解。提出问题时要准确并包含所需的信息。
  • 因为只是按照规范,你只需要做对就行了。
  • 我反复阅读 SOAP 手册,我尝试了所有可能的方法,以及所有愚蠢且不应该的方法,但我无法让它发挥作用,所以我已经开始拍摄了在黑暗/恐慌/绝望中。我能想出的最后一个稍微合乎逻辑的解释是服务器不支持我需要的标头,但是由于我对服务器重新配置不太熟悉(或多或少是新手),所以我决定在这里问.. .
猜你喜欢
  • 1970-01-01
  • 2020-10-05
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2022-11-14
  • 2012-03-14
  • 2018-12-08
相关资源
最近更新 更多