1

我需要从 php 连接到 SOAP 服务器,我阅读了很多文档、示例和教程,但我仍然无法对我的服务器进行身份验证。我已经完成了以下工作:

 $agencyNumber = 7818619810;
    $fullTransmission = false;
    //$context = array('header' => 'Content-type: application/soap+xml; charset=utf-8');
    $params = array( 'agencyNumber'     => 7818619810, 'fullTransmission' => 0/*,$context*/);

    $client = new SoapClient("http://link/to/server?wsdl");
   $test =  $client->__getFunctions();
    var_dump($test );// returns the functions my supplier provides, as well __getTypes() gives a bunch of variable arrays ect..
    $response = $client->__soapCall('GetTransmissionTicket',array($params) );//line 16 which is mentioned on error print
    var_dump($response);

即使我设置$context了,当我尝试运行时,我也会收到以下错误:

致命错误:未捕获的 SoapFault 异常:[HTTP] 无法处理消息,因为内容类型为 'text/xml; charset=utf-8' 不是预期的类型 'application/soap+xml; 字符集=utf-8'。在 C:\xampp\htdocs\xml\inc\connection_test.php:16 堆栈跟踪:#0 [内部函数]:SoapClient->__doRequest('http://interfac...', '..//my- provider...', 1, 0) #1 C:..path..test.php(16): SoapClient->__soapCall('GetTransmission...', Array) #2 {main} 在 C: 中抛出。第 16 行的 .path..test.php

我试图调用的远程方法被调用GetTransmissionTicket,它接受两个参数,(int)agencyNumberfullTransmission(bool)..

我想强调一下,关于这个主题有很多线程,其中一些非常接近我的问题(1、2、3等等.. ,但我真的无法解决问题。请帮忙..亲切的问候..

4

6 回答 6

10

尝试$params = array( 'agencyNumber' => 7818619810, 'fullTransmission' => false);

代替$params = array( 'agencyNumber' => 7818619810, 'fullTransmission' => 0);

或者

利用$client = new SoapClient("http://link/to/server?wsdl", array('soap_version' => SOAP_1_1));

因为 application/soap+xml是使用 SOAP 1.2 时传递的内容类型,text/xml与 SOAP 1.1 一起使用,

参考: 如何更改请求的内容类型?

于 2013-05-29T12:21:25.080 回答
2

一个简单的soap和php示例可以是

$url="your WSDL url";
$method = "Method you are calling";
$error=0;
$client = new SoapClient($url);

 try
  { 
    $info = $client->__call($method, array($param));
  } 
  catch (SoapFault $fault) 
 { 
    $error = 1; 
    errorReport($fault->faultcode,$fault->faultstring);
    die;
    /*echo '<script type="text/javascript">alert("Sorry,App Returne the following ERROR:'.$fault->faultcode."-".$fault->faultstring.'  We will now take you back to our homepage."); window.location = "'.$_SERVER['PHP_SELF'].'";</script> '; */

         }

     if($error==1)
      {
         $xml=$fault->faultstring;
     }else{
        $xml = $info;
     }
    return $xml;

尝试实施它并告诉我。如果它适合你。

于 2013-05-28T10:51:24.120 回答
1

最后一行不应该是var_dump($response); 而不是var_dump($client);

无论如何,您也可以尝试使用它来获得结果:

$response = $client->GetTransmissionTicket(array($params) );
var_dump($response);
于 2013-05-24T18:08:49.580 回答
1

我通过从 SOAP 1.2 切换到 SOAP 1.1 解决了这个问题:

$this->client = new SoapClient(
    $url,
    array(
        "trace" => TRUE,
        "exception" => 0,
        "soap_version" => SOAP_1_1,
        "cache_wsdl" => WSDL_CACHE_MEMORY,
        "local_cert" => 'mycert.pem',
    )
);
于 2015-01-01T09:16:03.483 回答
0

我会回答我自己的问题,以便有一天它可以帮助某人。我使用了 nusoap 并将编码更改为 utf-8。代码片段如下:

require_once "nusoap.php";
$client = new nusoap_client("http://interface.--Serivce-Supplier-Link/Service.svc?wsdl", "wsdl");
$client->soap_defencoding = 'UTF-8';

$result = $client->call("GetTransmissionTicket", array( 'agencyNumber'     => 13155, 'fullTransmission' => false));
var_dump($result);

亲切的问候

于 2013-05-30T08:00:37.893 回答
0

可能有点晚,但可以帮助别人。所以这里是: $params已经是一个数组,所以你不必使用 array($params)

$response = $client->__soapCall('GetTransmissionTicket',array($params) );

而是在调用时使用简单的 $params。像这样检查它

$response = $client->GetTransmissionTicket($params);

也用于$client->__getTypes();验证要传递的参数。使用catch可以很好的追踪faultstring和faultactor。最后,如果仍然没有得到解决方案,请使用soapUI(一个软件)检查它。

于 2013-05-30T07:14:35.327 回答