`

Java 调用PHP的Web Service

 
阅读更多

 

usoap是PHP环境中的开源soap工具,算是用得比较多的一个工具了。

    在utf-8环境中,nusoap可以工作得很好。但是当用于中文环境中时,nusoap经常会出现一些让人不得其解的问题。

    最近一个项目中,服务端是用nusoap实现的,支持UTF-8和GBK两种字符集。

    当客户端用GBK来调用服务时,出现错误:Charset from HTTP Content-Type US-ASCII does not match encoding from XML declaration GBK,意思是说,客户端的请求中,HTTP Content-Type的字符集是US-ASCII,而soap请求的XML声明里,字符集是GBK,两者不匹配。检查soap client的request变量,HTTP Content-Type的值也是GBK,怎么会变成了US-ASCII呢?有点莫名其妙了。于是只好跟踪nusoap的源码,发现nusoap在处理HTTP Content-Type时把US-ASCII,ISO-8859-1,UTF-8以外的字符集都默认为US-ASCII。最终发现其原因是因为nusoap使用了xml parser,而xml parser只支持这几种字符集。所以客户端在调用时,当采用GBK编时,调用的HTTP Content-Type 和 soap request的字符集都应该换成ISO-8859-1。

    稍后在封装客户端时,也遇到一个类似的问题。客户端字符集声明为GBK,服务端在返回SOAP调用结果时 HTTP Content-Type和soap request都声明字符集为GBK,客户端没有获取任何值。查看soap client的response对象,发现服务端返回正确。为解决这个问题,只好修改服务端,把HTTP Content-Type和soap response的字符集都声明为ISO-8859-1。

    所以在使用nusoap时,当遇到GBK或GB2312字符集时,可以使用ISO-8859-1代替。

=============================================================================================

 

PHP Web Service Server端:

 

<?php
//header("Content-Type:text/html;charset=UTF-8");

// Pull in the NuSOAP code
require_once('./lib/nusoap.php');

// Define the method as a PHP function
function hello($name) {
    return '你好! ' . $name;
}

// Create the server instance
$server = new soap_server;

$server->configureWSDL('hellowsdl', 'urn:hellowsdl');
$server->wsdl->schemaTargetNamespace = 'urn:hellowsdl';

// Register the method to expose
$server->register('hello',
array('name'=>'xsd:string'),
array('return'=>'xsd:string'),
'urn:hellowsdl',
'urn:hellowsdl#hello',
'rpc',
'encoded',
'Say hello to somebody'
);

// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>

 

 

   Client 端:

 

<?php
//header("Content-Type:text/html;charset=GB2312");
// Pull in the NuSOAP code
require_once('./lib/nusoap.php');
// Create the client instance
$client = new soapclient('http://localhost/soapTest/helloService.php?wsdl',true);
// Call the SOAP method
$param = array("name"=>"安迪");
$result = $client->call('hello', $param);
// Display the result
//print_r($result);

if(!$err=$client->getError()){
	print_r($result );
	print('</br>');
	echo "程序返回: ", htmlentities($result,ENT_QUOTES,GB2312);
}
else{
	echo "错误: ", htmlentities($result,ENT_QUOTES,GB2312);
}

echo   ' <h2> Request </h2> <pre> '   .   htmlspecialchars($client-> request,   ENT_QUOTES,GB2312)   .   ' </pre> '; 
echo   ' <h2> Response </h2> <pre> '   .   htmlspecialchars($client-> response,   ENT_QUOTES,GB2312)   .   ' </pre> '; 
echo   ' <h2> Debug </h2> <pre> '   .   htmlspecialchars($client-> debug_str,   ENT_QUOTES,GB2312)   .   ' </pre> '; 

?>

 

 

 

  Java代码:

 

  注意: 要使用Axis1.x, 去官网不要下载了Axis2。好像Axis1.x 和 Axis2还是差别很大的,而且目前Axis1.x的文档比较全点。这些是网上搜到的说法。

 

  如果需要使用中文参数调用Web Service,必须使用ISO-8859-1编码参数,返回的Response再解码。不要使用别的编码,会出错!

 


import org.apache.axis.client.Service;

import org.apache.axis.client.Call;

public class WebServiceTest {
	public static void main(String[] args) {
        String endpoint = "http://localhost/soapTest/helloService.php";
        //String endpoint = "http://testweb.dev.php/testWebService/testWebService.php";//该段就是上面刚将的地址 
        Service service = new Service();
        Call call;
		try {
		call = (Call) service.createCall();
        call.setTargetEndpointAddress(new java.net.URL(endpoint));
        call.setOperationName("hello");
        

        String param = new String("安迪".getBytes(),"ISO-8859-1");//如果没有加这段,中文参数将会乱码
        //String param = new String("中文");
        String s = (String) call.invoke(new Object[] {param});
        s = new String(s.getBytes("ISO-8859-1"));//如果没有转换编码,中文也会乱码
        System.out.println(s);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
 
分享到:
评论

相关推荐

    java调用hessianphp写得web service

    本文给出了一个java语言作为客户端,hessianphp语言写得web service的示例代码,和详细的说明。

    Android、iPhone和Java、php四个平台一致的3des加密的类

    因为手机端后台通常是用php开发的Web Service,Android和iPhone客户端调用同样的Web Service接口,为了数据安全考虑,要对数据进行加密。以前用java做后台时候有过加密,就拿过来,用php调通了,在3个平台间加解密的...

    PHP调用JAVA的WebService简单实例

    使用PHP调用JAVA语言开发的WebService。客户端提交两个String类型的参数,服务端返回一个对象类型。服务端使用AXIS-1.4作为SOAP引擎。客户端为PHP5.2.9,使用NuSOAP作为SOAP引擎。 服务端 对象类复制代码 代码如下:...

    致远A8-M平台API参考手册

    1、 可以跳过 SOAP,直接调用 Web service 的 Java 本地接口实现。 2、 可以略过下面几节,直接从服务列表开始阅读,在 Java 项目中包含 seeyon-api.jar 和 v3x-services.jar 即可。 3、 编写的代码必须与 A8 部署...

    JSP API接口和返回的版本

    对于服务器端程序,我们应该将它命名为 server.php(这是因为客户端调用时用的是这个名字,而不是 PHPRPC 的什么规定),然后把它放在本地 Web 服务器的根目录下,并保证服务器可以正常运行 PHP 程序,之后在浏览器...

    PHP API接口和返回的版本

    对于服务器端程序,我们应该将它命名为 server.php(这是因为客户端调用时用的是这个名字,而不是 PHPRPC 的什么规定),然后把它放在本地 Web 服务器的根目录下,并保证服务器可以正常运行 PHP 程序,之后在浏览器...

    php5 apache 2.2 webservice 创建与配置(java)

    php 5 apache 2.2 webservice 创建与配置 测试工具:wsCaller.jar (此文是给java程序调用的webservice) 提示:要运行wsCaller.jar 要选安装jdk 如果没有安装jdk 则wsCaller.jar 会以压缩包的形式显示 1 写webservice...

    ASP API接口和返回的版本

    对于服务器端程序,我们应该将它命名为 server.php(这是因为客户端调用时用的是这个名字,而不是 PHPRPC 的什么规定),然后把它放在本地 Web 服务器的根目录下,并保证服务器可以正常运行 PHP 程序,之后在浏览器...

    .NET API接口和返回的版本

    对于服务器端程序,我们应该将它命名为 server.php(这是因为客户端调用时用的是这个名字,而不是 PHPRPC 的什么规定),然后把它放在本地 Web 服务器的根目录下,并保证服务器可以正常运行 PHP 程序,之后在浏览器...

    JS JSP ASP .NET J2AM API接口和返回的版本

    对于服务器端程序,我们应该将它命名为 server.php(这是因为客户端调用时用的是这个名字,而不是 PHPRPC 的什么规定),然后把它放在本地 Web 服务器的根目录下,并保证服务器可以正常运行 PHP 程序,之后在浏览器...

    JS API接口和返回的版本

    对于服务器端程序,我们应该将它命名为 server.php(这是因为客户端调用时用的是这个名字,而不是 PHPRPC 的什么规定),然后把它放在本地 Web 服务器的根目录下,并保证服务器可以正常运行 PHP 程序,之后在浏览器...

    2AM API接口和返回的版本

    对于服务器端程序,我们应该将它命名为 server.php(这是因为客户端调用时用的是这个名字,而不是 PHPRPC 的什么规定),然后把它放在本地 Web 服务器的根目录下,并保证服务器可以正常运行 PHP 程序,之后在浏览器...

    php的webservice的wsdl的XML无法显示问题的解决方法

    JAVA如何调用wsdl过程详解java WSDL接口webService实现方式PHP调用wsdl文件类型的接口代码分享解析利用wsdl.exe生成webservice代理类的详解在PHP中利用wsdl创建标准webservice的实现代码Java调用CXF WebService接口...

    开源文档管理系统LogicalDOC v6.4.1

    LogicalDoc的一个最大的特点是,它是可以通过Web Service去调用。 LogicalDOC 6.4 支持为每个目录设定基本的文档模板,目录中引入书签功能,可针对目录进行搜索,支持登录后的默认页面配置;可配置的文档预览、...

    开源文档管理系统LogicalDOC v6.3.rar

    LogicalDoc的一个最大的特点是,它是可以通过Web Service去调用。 LogicalDOC特性: 该系统支持在文档中添加注释。 支持对文件扩展名的分析器进行动态配置。 支持充分预览电子邮件的文件类型。 Tagclond可以被...

    ZendFramework中文文档

    9.6.4. Self-defined OUTPUT formats using PHP's date() format specifiers 9.7. Working examples 9.7.1. Checking dates 9.7.2. Sunrise and Sunset 9.7.3. Timezones 10. Zend_Db 10.1. Zend_Db_Adapter ...

    springCloud

    包括Feign注解和JAX-RS注解 支持可插拔的HTTP编码器和解码器 支持Hystrix和它的Fallback 支持Ribbon的负载均衡 支持HTTP请求和响应的压缩Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    目前支持JSP的应用服务器是较多的,Tomcat是其中较为流行的一个Web服务器,被JavaWorld杂志的编辑选为2001年度最具创新的Java产品,可见其在业界的地位。 Tomcat是一个免费的开源的Serlvet容器,在Tomcat中,应用...

    Google Android SDK开发范例大全(第3版) 1/5

    Web Service存取服务:内嵌网页浏览器、Ajax网页特效、手机气象局、网络播放mp3、网络安装apk程序、远程下载手机铃声、XML-RPC移动博客发布器、手机RSS阅读器、地震速报、网页快照等。 完备的Google网络服务:Google...

    Google Android SDK开发范例大全(第3版) 4/5

    Web Service存取服务:内嵌网页浏览器、Ajax网页特效、手机气象局、网络播放mp3、网络安装apk程序、远程下载手机铃声、XML-RPC移动博客发布器、手机RSS阅读器、地震速报、网页快照等。 完备的Google网络服务:Google...

Global site tag (gtag.js) - Google Analytics