我需要从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 ...', 数组)在第16行的C:.. path..test.php中抛出#2 {main}
我试图调用的远程方法称为GetTransmissionTicket
,它有两个参数,(int)agencyNumber
和fullTransmission
(bool)..
我想强调的是,这个主题有很多主题,其中一些非常接近我的问题(1,2,3等等。 ),但我真的无法解决问题。请伸手...... 亲切的问候..
答案 0 :(得分: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一起使用,
答案 1 :(得分: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;
尝试实施它并告诉我。如果它适合你。
答案 2 :(得分:1)
最后一行不应该是 var_dump($ response); 而不是 var_dump($ client);
无论如何,您也可以尝试使用它来获得结果:
$response = $client->GetTransmissionTicket(array($params) );
var_dump($response);
答案 3 :(得分: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',
)
);
答案 4 :(得分:0)
可能会迟到但可以帮助别人。所以这里:
$params
已经是一个数组,所以你不必在
$response = $client->__soapCall('GetTransmissionTicket',array($params) );
在调用时使用简单的$ params.check就像这样
$response = $client->GetTransmissionTicket($params);
还使用$client->__getTypes();
来验证要传递的参数。
使用catch来追踪faulttringand faultactor。
最后,如果还没有得到解决方案,请使用soapUI(软件)进行检查。
答案 5 :(得分: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);
亲切的问候