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

一.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));
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值