PHP Soap-逻辑、服务器和许多其他问题


PHP Soap - logic, server, and a lot of other problems

我们有以下场景:

  1. 设置一个web服务-wsdl等等,应该监听客户端发送的数据,接收它,处理它,如果一切正常,则发送一个"ok"响应,如果有东西坏了,则发送"false"响应
  2. 客户端运行一个脚本,该脚本生成soap/xml请求位,创建一个soap客户端并将请求发送到wsdl
  3. 客户端会得到一个结果,指示web服务未处理数据-false。而且web服务根本不接收任何数据

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

我尝试将内置Soap与SoapClient__doRequest__call一起使用(有点尝试了所有方法),但什么也没发生——仍然得到'false'的结果。为了使用Soap 1.2,我尝试重新编写NuSoap,但仍然只有返回true的'false'结果。

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

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

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

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

编辑:

$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客户端-发送错误的标头";soapenv:VersionMismatch";

您在这里提问的方式在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所需的application/soap+xml——如果是,这可能是问题所在吗——回到问题1,或者我如何将类型添加到header_accert?

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

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

    这让我想知道你为什么真的问?是什么让你认为你需要在ini设置中添加任何内容(你没有进一步指定)?