杰瑞科技汇

Java如何调用PHP的WebService?

  1. PHP 端:创建一个符合标准规范的 WebService。
  2. Java 端:根据 PHP WebService 的规范,编写客户端代码进行调用。

下面我将分别针对最主流的两种 WebService 类型——SOAPREST,提供详细的步骤和代码示例。

Java如何调用PHP的WebService?-图1
(图片来源网络,侵删)

调用 PHP SOAP WebService

SOAP (Simple Object Access Protocol) 是一种基于 XML 的协议,它具有严格的规范,通常使用 WSDL (Web Services Description Language) 文件来描述服务的接口、方法、参数和返回值,这使得客户端的调用非常标准化。

第 1 步:PHP 端创建 SOAP WebService

PHP 内置了 SoapServerSoapClient 类来处理 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

Java如何调用PHP的WebService?-图2
(图片来源网络,侵删)

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.phpcalculator.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如何调用PHP的WebService?-图3
(图片来源网络,侵删)

创建 Java 客户端项目

方法 A:使用 wsimport 工具(推荐) 这是最标准、最简单的方法。wsimport 是 JDK 自带的工具,它会根据 WSDL 文件自动生成客户端所需的 Java 代码(存放在一个包中)。

  1. 打开命令行,导航到你希望生成代码的目录。

  2. 执行以下命令:

    wsimport -p com.example.client -keep http://localhost/soap_service/calculator.wsdl
    • -p com.example.client:指定生成的代码包名。
    • -keep:保留生成的源文件,方便查看。
    • 后面跟着你的 WSDL 文件 URL。
  3. 执行后,会在 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. 创建

分享:
扫描分享到社交APP
上一篇
下一篇