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

PHP 呼叫 Java WebService (Axis + NuSOAP) 完整實戰教學

     編輯:PHP 綜合知識

架構概覽

  • 服務端:Java + Axis 1.4 (SOAP 引擎)
  • 客戶端:PHP 5.2.9 + NuSOAP 庫
  • 交互:客戶端傳兩個 String 參數,服務端回傳 Person 物件

服務端代碼

1. 資料傳輸物件 (DTO)

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 略...
}

2. 服務實作類

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);
        } else if ("xiaoli".equals(loginName) && "123456".equals(loginPasswd)) {
            p.setUsername("小麗");
            p.setAge(23);
            p.setSex(false);
        } else {
            return null;
        }
        return p;
    }
}

部署至 Axis,WSDL 地址類似:https://localhost:8080/axis/services/UserLoginWS?wsdl

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("<h2>Constructor error</h2><pre>$err</pre>");
}

// 呼叫遠端方法
$param = ['loginName' => 'laoli', 'loginPasswd' => '111111'];
$result = $client->call('login', $param);

// 統一錯誤處理
if ($client->fault) {
    echo "<h2>Fault</h2><pre>"; print_r($result); echo "</pre>";
} else {
    $err = $client->getError();
    if ($err) {
        echo "<h2>Error</h2><pre>$err</pre>";
    } else {
        echo "<h2>Result</h2><pre>"; print_r($result); echo "</pre>";
    }
}

// 第二次呼叫示範
$param = ['loginName' => 'xiaoli', 'loginPasswd' => '123456'];
$result = $client->call('login', $param);
// 同樣錯誤處理...
?>

關鍵配置說明

屬性用途
soap_defencodingSOAP 請求預設編碼
decode_utf8false 保持 UTF-8 不自動解碼為 ISO-8859-1
xml_encodingXML 文檔宣告編碼

常見問題排查

  1. WSDL 無法訪問:檢查防火牆、Axis 服務是否啟動、URL 是否正確。
  2. 中文亂碼:確保 Java 端檔案編碼 UTF-8、Axis 配置 UTF-8、PHP 端 xml_encoding 設為 utf-8。
  3. 複雜類型映射失敗:NuSOAP 對巢狀複雜類型支援有限,必要時手動構造 XML 或改用 PHP 內建 SoapClient(PHP 5+)。
  4. 超時:調整 default_socket_timeout 或 NuSOAP $client->timeout。

現代替代方案建議

  • PHP 5.0+ 內建 SoapClient,效能更好、無需第三方庫,語法:$client = new SoapClient($wsdl); $result = $client->login($param);
  • REST/JSON API 替代 SOAP:更輕量、跨語言支援更佳、除錯容易。
  • 若必須維護舊 SOAP 系統,建議升級 NuSOAP 至最新版(GitHub: nusoap/nusoap)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved