抛出 SoapFault 时更改 HTTP 状态代码
Changing HTTP Status Code when throwing SoapFault
每当我在 PHP 应用程序中抛出 SoapFault
时,HTTP 状态代码就会设置为 HTTP/1.1 500 Internal Service Error
。即使我在抛出 SoapFault
之前使用 http_response_code()
或 header()
将状态代码设置为不同的东西,也会发生这种情况。抛出 SoapFault
时是否无法更改状态码?而且不应该叫HTTP/1.1 500 Internal Server Error
吗?我什至不知道 HTTP/1.1 500 Internal Service Error
存在。
我正在使用 SoapUI 检查来自 SoapServer
的响应。
抛出 SoapFault
的示例(在 SoapServer
object 处理的函数内)
http_response_code(404);
throw new SoapFault('Client', 'The specified item was not found');
示例响应:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>The specified item was not found</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
示例响应 headers:
Date Thu, 18 Jun 2015 12:27:23 GMT
Content-Length 299
#status# HTTP/1.1 500 Internal Service Error
Expires Thu, 19 Nov 1981 08:52:00 GMT
Set-Cookie PHPSESSID=kqhubpja05jfcluohbgts8lmk6; path=/
Connection close
Content-Type text/xml; charset=utf-8
Server Apache/2.4.9 (Win64) PHP/5.5.12
X-Powered-By PHP/5.5.12
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma no-cache
我最终编写了自己的代码来输出 soap 故障。然后我可以 return 我想要的任何 HTTP 状态代码。我不确定 $faultname
和 $headerfault
应该用于什么。如果您有任何想法,请发表评论。
function soapFault($faultcode, $faultstring, $faultactor = null, $detail = null, $faultname = null, $headerfault = null) {
switch($faultcode) {
case 'Client':
case 'Server':
case 'VersionMismatch':
case 'MustUnderstand':
$faultcode = 'SOAP-ENV:'.$faultcode;
}
die(
<<<FAULT
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>$faultcode</faultcode>
<faultstring>$faultstring</faultstring>
<faultactor>$faultactor</faultactor>
<detail>$detail</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
FAULT
);
}
每当我在 PHP 应用程序中抛出 SoapFault
时,HTTP 状态代码就会设置为 HTTP/1.1 500 Internal Service Error
。即使我在抛出 SoapFault
之前使用 http_response_code()
或 header()
将状态代码设置为不同的东西,也会发生这种情况。抛出 SoapFault
时是否无法更改状态码?而且不应该叫HTTP/1.1 500 Internal Server Error
吗?我什至不知道 HTTP/1.1 500 Internal Service Error
存在。
我正在使用 SoapUI 检查来自 SoapServer
的响应。
抛出 SoapFault
的示例(在 SoapServer
object 处理的函数内)
http_response_code(404);
throw new SoapFault('Client', 'The specified item was not found');
示例响应:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>The specified item was not found</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
示例响应 headers:
Date Thu, 18 Jun 2015 12:27:23 GMT
Content-Length 299
#status# HTTP/1.1 500 Internal Service Error
Expires Thu, 19 Nov 1981 08:52:00 GMT
Set-Cookie PHPSESSID=kqhubpja05jfcluohbgts8lmk6; path=/
Connection close
Content-Type text/xml; charset=utf-8
Server Apache/2.4.9 (Win64) PHP/5.5.12
X-Powered-By PHP/5.5.12
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma no-cache
我最终编写了自己的代码来输出 soap 故障。然后我可以 return 我想要的任何 HTTP 状态代码。我不确定 $faultname
和 $headerfault
应该用于什么。如果您有任何想法,请发表评论。
function soapFault($faultcode, $faultstring, $faultactor = null, $detail = null, $faultname = null, $headerfault = null) {
switch($faultcode) {
case 'Client':
case 'Server':
case 'VersionMismatch':
case 'MustUnderstand':
$faultcode = 'SOAP-ENV:'.$faultcode;
}
die(
<<<FAULT
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>$faultcode</faultcode>
<faultstring>$faultstring</faultstring>
<faultactor>$faultactor</faultactor>
<detail>$detail</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
FAULT
);
}