在經過一番頭痛並查看 PHP 原始碼後,我終於找出為什麼 handle() 函式會立即回傳帶有字串「Bad Request」的錯誤。
原來我的用戶端傳送的是有效的 XML,但 XML 的第一行是實際的 XML 宣告
<?xml version="1.0" encoding="UTF-8"?>
當呼叫 SoapServer 類別中的「handle」函式時,它會先嘗試解析 XML。當 XML 文件無法解析時,會回傳「Bad Request」錯誤,並且腳本的執行會立即停止。我假設 PHP 中內建的 XML 解析器 (libxml2) 已經假設文件為 XML,當它找到宣告時,它會認為它無效。
我在呼叫 handle() 函式之前,在我的服務中新增了一些 XML 解析呼叫,以檢查 XML 是否有效並避免「Bad Request」錯誤。這也讓我能夠回傳更合適的錯誤訊息
<?php
$parser = xml_parser_create("UTF-8");
if (!xml_parse($parser,$HTTP_RAW_POST_DATA,true)){
$webService->fault("500", "無法解析 XML: ".
xml_error_string(xml_get_error_code($parser)).
" 於第 ".xml_get_current_line_number($parser).
",欄位:".xml_get_current_column_number($parser));
}
?>