- PHP 端:创建一个符合标准规范的 WebService。
- Java 端:根据 PHP WebService 的规范,编写客户端代码进行调用。
下面我将分别针对最主流的两种 WebService 类型——SOAP 和 REST,提供详细的步骤和代码示例。

调用 PHP SOAP WebService
SOAP (Simple Object Access Protocol) 是一种基于 XML 的协议,它具有严格的规范,通常使用 WSDL (Web Services Description Language) 文件来描述服务的接口、方法、参数和返回值,这使得客户端的调用非常标准化。
第 1 步:PHP 端创建 SOAP WebService
PHP 内置了 SoapServer 和 SoapClient 类来处理 SOAP 通信,我们将创建一个简单的计算器服务。
创建服务端文件 soap_server.php
<?php
// 定义一个类,包含我们希望暴露的 WebService 方法
class Calculator {
/**
* 加法
* @param int $a
* @param int $b
* @return int
*/
public function add($a, $b) {
return $a + $b;
}
/**
* 减法
* @param int $a
* @param int $b
* @return int
*/
public function subtract($a, $b) {
return $a - $b;
}
}
// 1. 获取 HTTP_RAW_POST_DATA (在 PHP 7.0+ 中,php://input 是更推荐的方式)
// $request = file_get_contents('php://input');
// 2. 创建 SoapServer 对象
// 第二个参数是 'uri',它是服务的命名空间,通常是一个唯一的 URI
$server = new SoapServer("http://localhost/soap_service/calculator.wsdl");
// 3. 将服务类设置为 SoapServer 的类
$server->setClass("Calculator");
// 4. 处理 SOAP 请求
// $server->handle($request);
$server->handle();
?>
创建 WSDL 文件 calculator.wsdl

WSDL 文件是服务的“说明书”,虽然 PHP 的 SoapServer 可以自动生成 WSDL,但手动创建可以更好地控制细节,这里为了演示,我们提供一个手动编写的简化版。
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://tempuri.org/calculator"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- 定义服务的命名空间 -->
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/calculator">
<xsd:element name="addRequest">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="a" type="xsd:int"/>
<xsd:element name="b" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="addResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="return" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!-- 可以为其他方法(如 subtract)也定义类似的结构 -->
</xsd:schema>
</wsdl:types>
<!-- 定义端口,即服务的访问点 -->
<wsdl:port name="CalculatorPort" binding="tns:CalculatorBinding">
<soap:address location="http://localhost/soap_service/soap_server.php"/>
</wsdl:port>
<!-- 定义绑定,即如何访问端口 -->
<wsdl:binding name="CalculatorBinding" type="tns:CalculatorPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="add">
<soap:operation soapAction="http://tempuri.org/calculator/add"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<!-- 为 subtract 方法添加类似定义 -->
</wsdl:binding>
<!-- 定义端口类型,即抽象的消息集合 -->
<wsdl:portType name="CalculatorPortType">
<wsdl:operation name="add">
<wsdl:input message="tns:addRequest"/>
<wsdl:output message="tns:addResponse"/>
</wsdl:operation>
<!-- 为 subtract 方法添加类似定义 -->
</wsdl:portType>
</wsdl:definitions>
部署说明:
你需要一个支持 PHP 的 Web 服务器(如 Apache 或 Nginx),将 soap_server.php 和 calculator.wsdl 放在网站的某个目录下(http://localhost/soap_service/),确保 PHP 的 soap 扩展已启用(在 php.ini 中取消注释 extension=soap)。
第 2 步:Java 端调用 SOAP WebService
Java 调用 SOAP 服务最经典的方式是使用 JAX-WS (Java API for XML Web Services)。
准备 Java 环境 确保你有一个 Java 开发环境(JDK)。

创建 Java 客户端项目
方法 A:使用 wsimport 工具(推荐)
这是最标准、最简单的方法。wsimport 是 JDK 自带的工具,它会根据 WSDL 文件自动生成客户端所需的 Java 代码(存放在一个包中)。
-
打开命令行,导航到你希望生成代码的目录。
-
执行以下命令:
wsimport -p com.example.client -keep http://localhost/soap_service/calculator.wsdl
-p com.example.client:指定生成的代码包名。-keep:保留生成的源文件,方便查看。- 后面跟着你的 WSDL 文件 URL。
-
执行后,会在
com.example.client包下生成一堆.java文件,如Calculator.java,CalculatorService.java,Add.java,AddResponse.java等。
方法 B:手动创建客户端(不推荐,除非有特殊需求) 你需要根据 WSDL 手动创建所有请求和响应对象以及服务接口,非常繁琐。
编写 Java 客户端代码
在 src 目录下创建一个 Client.java 文件。
package com.example.client;
public class Client {
public static void main(String[] args) {
// 1. 创建服务视图 (Service)
// CalculatorService 是 wsimport 生成的类,它代表了整个 WebService
CalculatorService service = new CalculatorService();
// 2. 获取端口 (Port)
// Calculator 是 wsimport 生成的接口,它代表了 WSDL 中定义的端口类型
Calculator calculator = service.getCalculatorPort();
try {
// 3. 调用 WebService 方法
int resultA = calculator.add(10, 5);
System.out.println("调用 add(10, 5) 的结果是: " + resultA);
// 假设 wsimport 也为 subtract 生成了代码
int resultB = calculator.subtract(10, 5);
System.out.println("调用 subtract(10, 5) 的结果是: " + resultB);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行客户端
编译并运行 Client.java。
javac -cp "path/to/generated/classes" com/example/client/Client.java java -cp ".:path/to/generated/classes" com.example.client.Client
(注意:类路径 classpath 需要包含 wsimport 生成的所有 .class 文件)
预期输出:
调用 add(10, 5) 的结果是: 15
调用 subtract(10, 5) 的结果是: 5
调用 PHP REST WebService
REST (Representational State Transfer) 不是一种协议,而是一种架构风格,它通常基于 HTTP 协议,使用 JSON 或 XML 作为数据交换格式,调用 REST 服务本质上是发送 HTTP 请求并解析响应。
第 1 步:PHP 端创建 REST WebService
PHP 没有像 SoapServer 那样的内置 REST 服务器,通常使用框架(如 Laravel, Slim)或原生代码来处理 HTTP 请求,这里我们用原生 PHP 演示。
**1. 创建
