由于工作的需要,帮我的同事阿韬测试一下.net的webservice在PHP下的应用.于是开始上网找资料,发现很多phper都是用nusoap.于是下载一个回来.用它自带的例子修改一下.可在文章的后面的附件中找到下载地址.
代码如下:
<?
php
require_once( ' ../nusoap/lib/nusoap.php ' );
$client = new soapclient( ' http://localhost/TestService/Service1.asmx?WSDL ' , true );
$err = $client -> getError();
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
// Doc/lit parameters get wrapped
$param = array( ' str ' => ' China ' );
$result = $client -> call( ' HelloWorld ' , array( ' parameters ' => $param), '' , '' , false , true , ' document ' , ' encoded ' );
// Check for a fault
if ($client -> fault) {
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
// Display the result
echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
}
}
echo ' <h2>Request</h2><pre> ' . htmlspecialchars($client -> request, ENT_QUOTES) . ' </pre> ' ;
echo ' <h2>Response</h2><pre> ' . htmlspecialchars($client -> response, ENT_QUOTES) . ' </pre> ' ;
echo ' <h2>Debug</h2><pre> ' . htmlspecialchars($client -> debug_str, ENT_QUOTES) . ' </pre> ' ;
?>
require_once( ' ../nusoap/lib/nusoap.php ' );
$client = new soapclient( ' http://localhost/TestService/Service1.asmx?WSDL ' , true );
$err = $client -> getError();
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
// Doc/lit parameters get wrapped
$param = array( ' str ' => ' China ' );
$result = $client -> call( ' HelloWorld ' , array( ' parameters ' => $param), '' , '' , false , true , ' document ' , ' encoded ' );
// Check for a fault
if ($client -> fault) {
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
// Display the result
echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
}
}
echo ' <h2>Request</h2><pre> ' . htmlspecialchars($client -> request, ENT_QUOTES) . ' </pre> ' ;
echo ' <h2>Response</h2><pre> ' . htmlspecialchars($client -> response, ENT_QUOTES) . ' </pre> ' ;
echo ' <h2>Debug</h2><pre> ' . htmlspecialchars($client -> debug_str, ENT_QUOTES) . ' </pre> ' ;
?>
如果我的webservice返回的内容中没有中文的话,则很简单就上面的例子就成功了.但是一个新的问题出现了,如果我的webservice中有中文的话,返回的值就变成了乱码.查看了一下response的结果,是正确的.应该是用nusoap处理的时候出现了问题.
由于我没有安装PHP断点调试工具(其实我都不知道有没有这个工具).所以只能一个方法,一个方法看.看了一天,终于看完了,原来还必须指定编码才可以的.如:
$client
=
new
soapclient(
'
http://localhost/TestService/Service1.asmx?WSDL
'
,
true
);
// 中间加入以下两行即可
$client -> soap_defencoding = ' UTF-8 ' ;
$client -> decode_utf8 = false ;
// 中间加入以下两行即可
$client -> soap_defencoding = ' UTF-8 ' ;
$client -> decode_utf8 = false ;