java与php相互调用_java php webservice相互调用

刚在项目中应用到了java与php通过webservice进行数据交互。觉得挺有意思,贴出来,跟大家分享。

一.java编写webservice服务端,php作为客户端调用.

1.首先我们写一个简单的java类并发布webservice.

package com.php;

import java.util.Map;

/**

* @author yangjuqi

* @createdate 2009-5-18 下午04:43:09

*

*/

public class WebServiceImpl {

public String sendTransact(Map map) throws Exception {

System.out.println("::: Call testModel1 :::");

if(map!=null){

String bugmanifestid = StringUtil.getValue(map.get("bugmanifestid"));

String editedby = StringUtil.getValue(map.get("editedby"));

String dditeddate = StringUtil.getValue(map.get("dditeddate"));

String fullinfo = StringUtil.getValue(map.get("fullinfo"));

String action = StringUtil.getValue(map.get("action"));

System.out.println("bugmanifestid ->" +bugmanifestid);

System.out.println("editedby      ->" +editedby);

System.out.println("dditeddate    ->" +dditeddate);

System.out.println("fullinfo      ->" +fullinfo);

System.out.println("action        ->" +action);

}

return "success";

}

}

2.配置server-config.wsdd

xmlns:java="http://xml.apache.org/axis/wsdd/providers/java

">

type="java:org.apache.axis.handlers.http.URLMapper" />

type="java:com.php.AuthenticationHandler" />

type="java:com.php.LogHandler">

value="com.php.WebServiceImpl" />

http://localhost:8088/testphpweb

3.发布到jboss后,访问http://localhost:8088/testphpweb/services/IWebService?wsdl

能看到xml文件就说明webservice发布好了。

4.写testphpweb.php文件

/*

* @author      juqi yang

>

* @create date 2009-05-18

*/

header("Content-Type: text/html; charset=GB2312");

echo " ::: PHP CALL JAVA-WEBSERVICE :::
";

require_once("nusoap/lib/nusoap.php");

// 要访问的webservice路径

$NusoapWSDL="http://localhost:8088/testphpweb/services/IWebService?wsdl

";

// 生成客户端对象

$client = new soapclient($NusoapWSDL, true);

// 设置参数(注意:PHP只能以'数组集'方式传递参数,如果服务端是java,用Map接收)

$param = array( 'bugmanifestid

' => 'E090500001',

'editedby'      => '张三',

'dditeddate'    => '2009-05-19',

'fullinfo'      => '已联系刘德华,筹备今晚吃饭的事,等待回复',

'action'        => '0');

echo "begin remote 。。。
";

// 调用远程方法

$result = $client->call('sendTransact', array($param)

);

echo "end remote 。。。
";

// 显示执行结果

if (!$err=$client->getError()){

echo '结果 : '.$result;

}else{

echo '错误 : '.$err;

}

?>

5.启动apache,访问http://localhost/service/testphpweb.php

php页面显示:

::: PHP CALL JAVA-WEBSERVICE :::

begin remote 。。。

end remote 。。。

结果 : success

jboss后台监视结果:

17:12:20,781 INFO  [STDOUT] ::: Call testModel1 :::

17:12:20,781 INFO  [STDOUT] bugmanifestid ->E090500001

17:12:20,781 INFO  [STDOUT] editedby      ->张三

17:12:20,781 INFO  [STDOUT] dditeddate    ->2009-05-19

17:12:20,781 INFO  [STDOUT] fullinfo      ->已联系刘德华,筹备今晚吃饭的事,等待回复

17:12:20,796 INFO  [STDOUT] action        ->0

到此,php作为客户端调用java写的webservice服务端完成.

二,php编写webservice服务端,java作为客户端调用.

1.编写php webservice

/*

* @author      juqi yang

>

* @create date 2009-05-18

*/

header("Content-Type: text/html; charset=GB2312");

require_once("nusoap/lib/nusoap.php");

function sendManifest($param)

{

//把接收到的数据显示出来

return "hello ".$param["projectid"]."<=>".$param["projectname"]."<=>".$param["moduleid"];

}

$server = new nusoap_server();

//配置WSDL namespace

$server->configureWSDL('myservice',                                    //服务名称

'http://localhost/service/web_call_center.php',                   //tns指定的namespace,一般填写自己的URI

true,                                                             //endpoint url or false

'rpc',                                                            //服务样式

'http://schemas.xmlsoap.org/soap/http',                           //传输协议,一直是这个。

'http://localhost/service/web_call_center.php'                    //wsdl 'types'元素targetNamespace

);

// 注册web服务

$server->register('sendManifest',                                      // 服务

array(

'projectid'     => 'xsd:string',

'projectname'   => 'xsd:string',

'moduleid'      => 'xsd:string',

'modulepath'    => 'xsd:string',

'bugtitle'      => 'xsd:string',

'bugtype'       => 'xsd:string',

'openedby'      => 'xsd:string',

'openeddate'    => 'xsd:string',

'assignedto'    => 'xsd:string',

'assigneddate'  => 'xsd:string',

'fixedtime'     => 'xsd:string',

'fullinfo'      => 'xsd:string',

'bugmanifestid' => 'xsd:string'),                                  // 输入参数;数组,指定类型

array('resultCode' => 'xsd:string'),                               // 输出;数组,指定类型

'http://localhost/service/web_call_center.php',                    // namespace of method

'',                                                                // soapaction

'rpc',                                                             // style

'encoded',                                                         // use

'serviceConsumeNotify'                                             // documentation

);

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';

$server->service($HTTP_RAW_POST_DATA);

?>

2.启动apache后,访问  http://localhost/service/phpserver.php

,如果页面如下图所示,表示webservice发布好了。

2a06d3078cef16bc11e9cf01cd4510f4.png

3.编写java客户端CallPhpServer .java 并调用php webservice

package com.php;

import java.util.HashMap;

import java.util.Map;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

/**

* @author yangjuqi

* @createdate 2009-5-18 下午05:31:06

*

*/

public class CallPhpServer {

/**

* 测试方法

* @return

* @throws Exception

*/

public static String callManifest() throws Exception {

System.out.println("0");

Service service = new Service();

Call call = (Call) service.createCall();

System.out.println("1");

call.setTargetEndpointAddress(new java.net.URL("http://localhost/service/phpserver.php

"));

call.setOperationName("sendManifest");

System.out.println("2");

Map map=new HashMap();

map.put("projectid", "109");

map.put("projectname", new String("新MM国际物流平台".getBytes(),"iso-8859-1"));

map.put("moduleid", "11");

map.put("modulepath", new String("财务管理".getBytes(),"iso-8859-1"));

map.put("bugtitle", new String("关于总账报表数据的问题".getBytes(),"iso-8859-1"));

map.put("bugtype", "TrackThings");

map.put("openedby", "zhangsan");

map.put("openeddate", "2009-05-31");

map.put("assignedto", "liumang");

map.put("assigneddate", "2009-05-31");

map.put("fixedtime", "2009-06-03");

map.put("fullinfo", new String("现在总账报表页面下的合计数据不对,烦请抓紧事件核实确认更正,谢谢!".getBytes(),"iso-8859-1"));

map.put("bugmanifestid", "E090500001");

call.addParameter("param", org.apache.axis.Constants.SOAP_ARRAY,javax.xml.rpc.ParameterMode.IN);

call.setReturnType(org.apache.axis.Constants.XSD_STRING);

System.out.println("3");

Object obj=call.invoke(new Object[]{map});

return obj.toString();

}

public static void main(String[] args) throws Exception {

System.out.println("::: call php webservice :::");

String str = callManifest();

String result=new String(str.getBytes("iso-8859-1"),"GBK");

System.out.println(result);

}

}

控制台显示结果:

::: call php webservice :::

0

log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).

log4j:WARN Please initialize the log4j system properly.

1

2

3

hello 109<=>新MM国际物流平台<=>11

到此,java作为客户端调用php的webservice服务端完成.

乱码问题

许多使用NuSoap 调用.NET WebService或J2EE  WebService的朋友可能都遇到过中文乱码问题,下面介绍这一问题的出现的原因和相应的解决方法。

NuSoap调用WebService出现乱码的原因:

通常我们进行WebService开发时都是用的UTF-8编码,这时我们需要设置:

view plaincopy to clipboardprint?

$client->soap_defencoding = 'utf-8';

$client->soap_defencoding = 'utf-8';

同时,需要让xml以同样的编码方式传递:

view plaincopy to clipboardprint?

$client->xml_encoding = 'utf-8';

$client->xml_encoding = 'utf-8';

至此应该是一切正常了才对,但是我们在输出结果的时候,却发现返回的是乱码。

NuSoap调用WebService出现乱码的解决方法:

实际上,开启了调试功能的朋友,相信会发现$client->response返回的是正确的结果,为什么$result =

$client->call($action, array('parameters' => $param)); 却是乱码呢?

研究过NuSoap代码后我们会发现,当xml_encoding设置为UTF-8时,NuSoap会检测decode_utf8的设置,如果为true,会执行 PHP 里面的utf8_decode函数,而NuSoap默认为true,

因此,我们需要设置:

view plaincopy to clipboardprint?

$client->soap_defencoding = 'utf-8';

$client->decode_utf8 = false;

$client->xml_encoding = 'utf-8';

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值