首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 調用 Java Axis WebService 完整實戰:NuSOAP 客戶端對接複雜類型返回

     編輯:PHP 相關知識

跨語言 WebService 對接是企業級集成常態。本文完整演示 Java Axis 1.4 服務端 暴露返回自定義對象 Person 的 login 方法,PHP 5.2+ NuSOAP 客戶端 調用並處理複雜類型返回的全流程代碼。

Java 服務端 (Axis 1.4)

1. 數據對象 Person.java

package com.example.ws;

import java.io.Serializable;

public class Person implements Serializable {
    private static final long serialVersionUID = -410186774891162281L;
    private String username;
    private int age;
    private boolean sex; // true: male, false: female

    // Getter/Setter 略
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    public boolean isSex() { return sex; }
    public void setSex(boolean sex) { this.sex = sex; }
}

2. 服務實現 UserLogin.java

package com.example.ws;

public class UserLogin {
    public Person login(String loginName, String loginPasswd) {
        Person p = new Person();
        if ("laoli".equals(loginName) && "111111".equals(loginPasswd)) {
            p.setUsername("老李");
            p.setAge(55);
            p.setSex(true);
        } elseif ("xiaoli".equals(loginName) && "123456".equals(loginPasswd)) {
            p.setUsername("小麗");
            p.setAge(23);
            p.setSex(false);
        } else {
            return null;
        }
        return p;
    }
}

3. 部署描述 deploy.wsdd (關鍵:映射複雜類型)

<deployment xmlns="https://xml.apache.org/axis/wsdd/"
            xmlns:java="https://xml.apache.org/axis/wsdd/providers/java">
  <service name="UserLoginWS" provider="java:RPC">
    <parameter name="className" value="com.example.ws.UserLogin"/>
    <parameter name="allowedMethods" value="login"/>
    <!-- 複雜類型映射 -->
    <typeMapping
        xmlns:ns="https://ws.example.com"
        qname="ns:Person"
        type="java:com.example.ws.Person"
        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
        encodingStyle="https://schemas.xmlsoap.org/soap/encoding/"/>
  </service>
</deployment>

PHP 客戶端

<?php
header("Content-Type: text/html;charset=utf-8");
require_once("libs/nusoap.php"); // NuSOAP 庫

$wsdl = 'https://localhost:8080/axis/services/UserLoginWS?wsdl';
$client = new nusoap_client($wsdl, true); // true = WSDL 模式

$client->soap_defencoding = 'utf-8';
$client->decode_utf8 = false;
$client->xml_encoding = 'utf-8';

// 錯誤檢查
if ($err = $client->getError()) {
    die("

Constructor error

$err
"); } // 調用 login $params = ['loginName' => 'laoli', 'loginPasswd' => '111111']; $result = $client->call('login', $params); // 統一異常處理 if ($client->fault) { echo "

Fault

"; print_r($result); echo "
"; } else { $err = $client->getError(); if ($err) { echo "

Error

$err
"; } else { echo "

Result

"; print_r($result); echo "
"; } } // 第二次調用 $params = ['loginName' => 'xiaoli', 'loginPasswd' => '123456']; $result = $client->call('login', $params); // 同樣錯誤處理...

關鍵配置解析

NuSOAP 選項作用建議值
soap_defencoding發送請求 XML 編碼'utf-8'
decode_utf8是否自動 UTF-8 解碼響應false (手動控制)
xml_encoding生成 XML 聲明編碼'utf-8'
call() 參數結構關聯陣列鍵需與 WSDL message part 名一致['loginName'=>..., 'loginPasswd'=>...]

返回值結構說明

NuSOAP 將複雜類型解析為巢狀關聯陣列:

Array
(
    [return] => Array
        (
            [username] => 老李
            [age] => 55
            [sex] => 1  // boolean true → 1
        )
)

訪問方式:$result['return']['username']。

常見問題與解決

問題原因解決
Class 'nusoap_client' not foundNuSOAP 庫未引入下載 nusoap.php 放入 libs/,require_once
SOAP-ERROR: Parsing WSDLWSDL 無法訪問/編碼錯誤瀏覽器驗證 ?wsdl、檢查防火牆、編碼統一 UTF-8
返回 null / 空對象Java 端邏輯未匹配、類型映射缺失檢查 deploy.wsdd typeMapping、Java 邏輯日誌
中文亂碼編碼不一致全鏈路 UTF-8,NuSOAP 設定上述三項編碼參數
Axis 1.4 序列化差異Axis 對 null、空陣列序列化行為特殊Java 端避免返回 null,改拋異常或返回空對象標記

現代化替代方案

  • PHP 端:ext/soap (原生 SoapClient) 替代 NuSOAP,性能更好、無第三方依賴。
  • Java 端:遷移至 JAX-WS (Metro/CXF) 或 Spring Boot + Apache CXF,Axis 1.4 已停止維護。
  • 協議升級:新專案優先 REST/JSON 或 gRPC,SOAP 僅維護存量系統。

掌握 WSDL 複雜類型映射、NuSOAP 編碼控制、異常處理流程,即可駕馭 PHP-Java SOAP 集成的核心難點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved