WebService即是一种跨平台的远程调用方法。一方提供服务,另一方使用服务。传输协议是HTTP,而传输的数据则是XML格式的数据。
它有两种方式,WSDL和SOAP。目前仅提及SOAP。
1.PHP提供SOAP服务
定义一个类,它里面有加、减和除三种操作
<?php
class Operator{
public function add($x,$y){
return $x+$y;
}
public function substract($x,$y){
return $x-$y;
}
public function divide($x,$y){
return $x/$y;
}
}
?>
使用PHP SOAP API,提供SOAP服务。(需要开启SOAP EXTENSION)
<?php
require("Operator.php");
$server = new SoapServer(null,array('uri' => "http://localhost:8089"));
$server->setClass("Operator");
$server->handle();
?>
假设提供服务的php为index.php
2.JAVA使用PHP提供的SOAP服务
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.Node;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
public class Main {
public void testSOAP(String opename,int x,int y){
String url = "http://localhost:8089/index.php";
SOAPConnectionFactory soapConnectionFactory = null;
SOAPConnection soapConnection = null;
MessageFactory messageFactory = null;
SOAPMessage soapMessage = null;
SOAPPart soapPart = null;
SOAPEnvelope soapEnvelope = null;
SOAPBody body = null;
try{
//建立连接
soapConnectionFactory = SOAPConnectionFactory.newInstance();
soapConnection = soapConnectionFactory.createConnection();
messageFactory = MessageFactory.newInstance();
soapMessage = messageFactory.createMessage();
soapPart = soapMessage.getSOAPPart();
soapEnvelope = soapPart.getEnvelope();
//设置调用的webservice方法,及传参
body = soapEnvelope.getBody();
SOAPElement element = body.addChildElement(soapEnvelope.createName(opename));
element.addChildElement("in0").addTextNode(String.valueOf(x));
element.addChildElement("in1").addTextNode(String.valueOf(y));
soapMessage.saveChanges();
//获取返回值
SOAPMessage reply = soapConnection.call(soapMessage,url);
soapPart = reply.getSOAPPart();
soapEnvelope = soapPart.getEnvelope();
body = soapEnvelope.getBody();
Node returnvalue = (Node) body.getChildElements().next();
if (returnvalue != null) {
if (returnvalue.getChildNodes().item(0).getNodeName().equals("return")) {
List<HashMap<String,String>> ReturnArray = new ArrayList<HashMap<String,String>>();
for (int i=0;i<returnvalue.getChildNodes().item(0).getChildNodes().getLength();i++) {
String key = returnvalue.getChildNodes().item(0).getChildNodes().item(i).getNodeName();
String value = returnvalue.getChildNodes().item(0).getChildNodes().item(i).getNodeValue();
System.out.println(key+":"+value);
}
}
} else {
System.out.println("nothing returned");
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
try {
soapConnection.close();
} catch (SOAPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Main main = new Main();
System.out.println("3+4:");
main.testSOAP("add",3,4);
System.out.println("9-7:");
main.testSOAP("substract",9,7);
System.out.println("20/4:");
main.testSOAP("divide",20,4);
}
}
运行结果如下:
3+4:
#text:7
9-7:
#text:2
20/4:
#text:5