0

我们有以下场景:

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

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

SoapClient我尝试使用带有,__doRequest的内置 Soap __call(尝试了一切),但没有任何反应 - 仍然得到'false'结果。我尝试重写 NuSoap 以使用 Soap 1.2,但仍然只是'false'返回 true 的结果。

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

  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”的完整路径

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

编辑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 - 发送错误的标头“soapenv:VersionMismatch”

4

1 回答 1

0

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

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

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

  2. 当客户端必须将数据发送到 Web 服务的功能时,我使用__doRequest还是__call?或者是其他东西?

    这取决于模式(WSDL 与否)以及您想要做什么。WSDL 是什么以及 WSDL 模式是什么,请从头到尾阅读 PHP 手册中的整个 Soap 书,我也建议,因为文档并不完美,您让自己熟悉 WSDL 是什么以及一些第三方 WSDL SoapClient 示例您可以通过您选择的互联网搜索引擎找到它们。请__doRequest参阅手册您可以用它做什么。因为__call该手册清楚地说明了它的用途,并且它已被弃用,因此您可能正在寻找它__soapCall

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

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

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

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

于 2013-02-06T14:38:48.733 回答