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服务。Hessian是一种高效的二进制RPC(远程过程调用)协议,它能够提供轻量级、高效的跨语言通信方式,特别适合于Java和PHP之间的交互。 首先,我们要理解Java...
### Java调用PHP的Webservice知识点详解 #### 一、Webservice简介 Webservice是一种用于不同应用程序之间进行通信的技术标准,通常使用XML作为数据交换格式。它可以被部署在不同的平台上,并且可以使用不同的编程...
标题 "java+xfire(web service) + php 客户端 并实现文件加密" 描述了一个集成项目,其中涉及到Java、XFire(一个基于Java的Web服务实现框架)和PHP的交互,以及文件加密功能。这个项目的目标是构建一个安全的分布式...
本文将深入探讨如何创建Web应用程序和服务以及如何进行Web Service调用,并基于提供的源码进行详细讲解。 首先,让我们理解Web应用程序和服务的基础概念。Web应用程序是在Web服务器上运行的软件,用户可以通过...
本主题将深入探讨如何使用PHP调用由Java编写的Web服务(Web Service)。Web服务是一种基于网络的、标准化的消息传递机制,允许不同平台的应用程序之间进行交互。PHP作为流行的服务器端脚本语言,与Java结合可以实现...
“test_service”可能是一个Java服务的示例,用于被PHP调用。这些文件组合起来,构成了一套完整的PHP调用Java服务的解决方案。 总结来说,PHP调用Java代码可以通过JNI、Socket通信、LAP协议或者消息队列等多种方式...
在实际开发中,有许多工具和框架可以帮助我们创建和使用XML Web Service,如Java的JAX-WS、.NET的ASP.NET Web Service、PHP的SOAP扩展等。这些工具通常简化了WSDL生成、SOAP消息处理等复杂任务。 六、安全考虑 XML ...
**Web Service** 是一种跨编程语言和操作系统平台的网络应用程序调用机制。它通过HTTP协议来发送和接收XML格式的信息,实现不同应用程序之间的交互。NetBeans 是一款功能强大的开源集成开发环境(IDE),特别适用于...
在Android开发中,获取网络上的数据是一种常见需求。...这两者各有优缺点,前者简单易用...但对于需要处理大量数据的大型应用,使用Java、.NET或PHP等开发的Web Service进行网络数据交互,能够提供更大的灵活性和扩展性。
这使得Delphi 6创建的Web Service能够与Java、.NET、PHP等其他平台的系统无缝对接。 9. **最佳实践**: 教程可能还会介绍一些最佳实践,比如如何优化性能、处理错误、版本控制以及如何设计可扩展和可维护的Web ...
本实例专注于PHP调用Web服务以及使用MyEclipse创建Web服务的详细过程,这对于初学者来说是一个很好的学习资源。 首先,让我们深入理解PHP调用Web服务的概念。Web服务通常基于SOAP(Simple Object Access Protocol)...
4. **Java调用PHP Web Service**:在Java中,可以使用JAX-WS(Java API for XML Web Services)或者Apache CXF库来调用PHP的Web服务。通过WSDL文件,Java可以生成相应的代理类,简化调用过程。 5. **CXF和Jersey...
在实际开发中,有许多工具和库可以帮助开发者实现SOAP通信,如Java的JAX-WS,.NET的ASMX和WCF,以及PHP的SoapClient等。 总结来说,SOAP作为XML跨平台Web Service开发技术,通过XML消息格式和HTTP传输协议,使得...
4. **SOAP客户端库**:大多数编程语言都有对应的SOAP客户端库,如Java的JAX-WS,Python的suds,PHP的SoapClient等,它们简化了动态调用Web Service的过程。开发者只需要提供WSDL地址,库会自动生成对应的调用方法。 ...
无论是Java、.NET、PHP还是其他语言编写的系统,都可以通过Web Service进行交互。 3. 灵活性:Web Service 的设计允许服务提供者和消费者之间的松耦合。这意味着服务的更新或更改不会立即影响到依赖它的应用程序,...
Web Service的主要优点是其互操作性,允许Java、.NET、PHP等不同技术栈的应用程序之间进行通信。 在实际项目中,Spring MVC常用于构建应用程序的前端控制层,处理HTTP请求,调用后端服务。CXF则可以作为这些服务的...
2. **跨平台通信**:Web Service不受特定编程语言或操作系统限制,允许Java、.NET、PHP等不同环境下的系统相互协作。 3. **移动应用后端**:移动应用可以利用Web Service获取数据,实现与服务器端的交互,减轻...
4.1 创建服务端:使用Java或PHP等后端语言,构建Web Service接口,处理来自Android客户端的请求。 4.2 客户端调用:在Android应用中,创建一个负责与Web Service交互的模块,处理网络请求,解析返回的XML或JSON数据...
因为手机端后台通常是用php开发的Web Service,Android和iPhone客户端调用同样的Web Service接口,为了数据安全考虑,要对数据进行加密。以前用java做后台时候有过加密,就拿过来,用php调通了,在3个平台间加解密的...
2. **集成企业服务**:PHPJava Bridge可以帮助PHP项目无缝接入企业级的Java服务,如EJB(Enterprise JavaBeans)或JMS(Java Message Service)。 3. **利用Java库**:如果项目需要使用特定的Java库,例如数据库...