您的位置:首页 > 编程语言 > PHP开发

PHP提供Web Service服务供JAVA调用(SOAP+WSDL)

2014-12-10 09:50 579 查看
一.PHP部分

首先是Operator.php,它提供了加、减、除三种运算方法(add,substract,divide),同时,校验SOAP Header,如果传入的头部username/password不对应admin/123,则认为是非法调用:

<?php
class Operator{
private $forbidden = '403 forbidden';

private function auth(){
$hdr = file_get_contents("php://input");
$auth = false;
try{
if(strpos($hdr,'soapenv:Header') !== FALSE){
$hdr = explode("<soapenv:Header>",$hdr);
$hdr = explode("</soapenv:Header>",$hdr[1]);
$hdr = $hdr[0];
$reg1 = '/<[^<>]+username[^<>]+>[^<>]+/';
$reg2 = '/<[^<>]+password[^<>]+>[^<>]+/';
preg_match($reg1,$hdr,$matchs);
$username = $matchs[0];
preg_match($reg2,$hdr,$matchs);
$password = $matchs[0];
if(isset($username) && isset($password)){
$username = substr($username,strpos($username,'>'));
$password = substr($password,strpos($password,'>'));
$username = str_replace('>','',$username);
$password = str_replace('>','',$password);
if($username == 'admin' && $password == '123'){
$auth = true;
}
}
}
}catch(Exception $ex){
file_get_contents('d:/test.txt',$ex->getMessage());
}
return $auth;
}

public function add($x,$y){
if($this->auth()){
return $x+$y;
}else{
return $this->forbidden;
}
}

public function substract($x,$y){
if($this->auth()){
return $x-$y;
}else{
return $this->forbidden;
}
}

public function divide($x,$y){
if($this->auth()){
return $x/$y;
}else{
return $this->forbidden;
}
}
}
?>

然后,此Operator类应该对应一个Operator.wsdl文件,用以描述:
1.webservice传输的文件类型

2.请求的参数类型,返回的参数类型

3.提供的方法,及方法的输入输出

如下,Operator.wsdl完全手写;其实只要静下来就可以写出来了,不需任何自动化工具

<?xml version="1.0" encoding="utf-8"?>
<!--targetNamepspace,tns point to the url-->
<definitions name="operator" targetNamespace="http://10.67.2.19:8088/" xmlns:tns="http://10.67.2.19:8088/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
<!--use xmlshcema define data type-->
<types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.mysoapservice.cn/">
</xsd:schema>
</types>
<!--request:functionname+Reqeuest,response:functionname+Response-->
<message name="addRequest">
<part name="param1" type="xsd:string"/>
<part name="param2" type="xsd:string"/>
</message>
<message name="addResponse">
<part name="result" type="xsd:string"/>
</message>
<message name="substractRequest">
<part name="param1" type="xsd:string"/>
<part name="param2" type="xsd:string"/>
</message>
<message name="substractResponse">
<part name="result" type="xsd:string"/>
</message>
<message name="divideRequest">
<part name="param1" type="xsd:string"/>
<part name="param2" type="xsd:string"/>
</message>
<message name="divideResponse">
<part name="result" type="xsd:string"/>
</message>
<!--define operation,input,output-->
<portType name="OperatorPort">
<operation name="add">
<input message="tns:addRequest"/>
<output message="tns:addResponse"/>
</operation>
<operation name="substract">
<input message="tns:substractRequest"/>
<output message="tns:substractResponse"/>
</operation>
<operation name="divide">
<input message="tns:divideRequest"/>
<output message="tns:divideResponse"/>
</operation>
</portType>
<binding name="OperatorSOAP" type="tns:OperatorPort">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="add">
<soap:operation soapAction="http://www.cwtservice.cn/newOperation/"/>
<input>
<soap:body use="encoded" namespace="urn:xmethods-delayed-quotes"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:xmethods-delayed-quotes"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
<operation name="substract">
<soap:operation soapAction="http://www.cwtservice.cn/newOperation/"/>
<input>
<soap:body use="encoded" namespace="urn:xmethods-delayed-quotes"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:xmethods-delayed-quotes"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
<operation name="divide">
<soap:operation soapAction="http://www.cwtservice.cn/newOperation/"/>
<input>
<soap:body use="encoded" namespace="urn:xmethods-delayed-quotes"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:xmethods-delayed-quotes"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="OperatorService">
<port name="AddSOAP" binding="tns:OperatorSOAP">
<soap:address location="http://10.67.2.19:8088/server.php"/>
</port>
</service>
</definitions>

3.server.php用于提供服务
<?php
require("Operator.php");
ini_set("soap.wsdl_cache_enabled", "0");
$server = new SoapServer("Operator.wsdl",array("uri"=>"http://10.67.2.19:8088"));
$server->setClass("Operator");
$server->handle();
?>

二、JAVA部分
1.因为PHP端已经提供了WSDL文件,这时,就可以用AXIS2(自己下一个)中的bin目录下的wsdl2java.bat,将WSDL文件转为JAVA类

命令为:

wsdl2java -uri http://10.67.2.19:8088/server.php?WSDL -o ./src

这时,就会在本目录的src目录下产生一个目录,它下面有build.xml文件,以及

OperatorServiceCallbackHandler.java

OperatorServiceStub.java

新建一个JAVA工程,将自动产生的这两个文件连同文件夹一并拷入项目中。

再加入需要的类库:



然后,就可以使用PHP提供的WebService方法了,就像使用本地类一样:

import javax.xml.namespace.QName;
import org.apache.axis2.client.ServiceClient;
import _19._2._67._10.OperatorServiceCallbackHandler;
import _19._2._67._10.OperatorServiceStub;
import _19._2._67._10.OperatorServiceStub.Add;
import _19._2._67._10.OperatorServiceStub.Divide;
import _19._2._67._10.OperatorServiceStub.Substract;
import _19._2._67._10.OperatorServiceStub.AddResponse;
import _19._2._67._10.OperatorServiceStub.DivideResponse;
import _19._2._67._10.OperatorServiceStub.SubstractResponse;
public class Main {
public String testSOAP(String opename,int param1,int param2){
String result = "";
OperatorServiceStub ope = null;
OperatorServiceCallbackHandler handler = null;
try {
ope = new OperatorServiceStub();
//得到Service client
ServiceClient client = ope._getServiceClient();
//加入soap请求头,用于认证
client.addStringHeader(new QName("auth","username"),"admin");
client.addStringHeader(new QName("auth","password"),"123");
if(opename.equals("add")){
Add add = new Add();
add.setParam1(String.valueOf(param1));
add.setParam2(String.valueOf(param2));
AddResponse response = ope.add(add);
result = response.getResult();
}else if(opename.equals("substract")){
Substract substract = new Substract();
substract.setParam1(String.valueOf(param1));
substract.setParam2(String.valueOf(param2));
SubstractResponse response = ope.substract(substract);
result = response.getResult();
}else if(opename.equals("divide")){
Divide divide = new Divide();
divide.setParam1(String.valueOf(param1));
divide.setParam2(String.valueOf(param2));
DivideResponse response = ope.divide(divide);
result = response.getResult();
}

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}

public static void main(String[] args) {
Main main = new Main();
System.out.println("1+2="+main.testSOAP("add",1,2));
System.out.println("4-2="+main.testSOAP("substract",4,2));
System.out.println("16/4="+main.testSOAP("divide",16,4));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐