SOAP:HTTP 错误请求
Posted
技术标签:
【中文标题】SOAP:HTTP 错误请求【英文标题】:SOAP: HTTP Bad Request 【发布时间】:2015-09-13 14:48:41 【问题描述】:我在请求 SOAP 调用后遇到错误。
故障代码:HTTP,故障字符串:错误请求
这是不是格式错误的消息?
try
$client = new SoapClient("http://ip_add/something.asmx?WSDL", array("trace" => true, 'exceptions' => 1));
$params = new \SoapVar('<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<RemittanceService xmlns="http://tempuri.org/">
<CreditTxnMessage xmlns="http://my_url">
<Corporate_UID xmlns="">66666</Corporate_UID>
<Mandate_Type xmlns="">P</Mandate_Type>
<MICR_No xsi:nil="true" xmlns="" />
<Instrument_No xsi:nil="true" xmlns="" />
<Remitter_Address1 xmlns="">285 enfiled pl</Remitter_Address1>
<Remitter_Address2 xmlns="">mississauga</Remitter_Address2>
<Remitter_Address3 xmlns="">16y2n4</Remitter_Address3>
<Remitter_Country xmlns="">Canada</Remitter_Country>
<Remitter_ZIP_Code xsi:nil="true" xmlns="" />
<Remitter_EmailID xsi:nil="true" xmlns="" />
<Remitter_Contact_No xmlns="" />
<Beneficiary_ZIP_Code xsi:nil="true" xmlns="" />
<Beneficiary_EmailID xsi:nil="true" xmlns="" />
<Beneficiary_Contact_No xmlns="" />
<Beneficiary_Bank_Name xmlns="">PNB</Beneficiary_Bank_Name>
</CreditTxnMessage>
</RemittanceService>
</soap:Body>
</soap:Envelope>', XSD_ANYXML);
$result = $client->__soapCall('RemittanceService', array($params));
highlight_string($client->__getLastRequest());
catch(SoapFault $fault)
die("SOAP Fault:<br />fault code: $fault->faultcode, fault string: $fault->faultstring");
我不知道这里出了什么问题。
堆栈跟踪
SoapFault exception: [HTTP] Bad Request in /var/www/mtes/public_html/application/controllers/bank_api_pnb.php:146
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://124.124....', 'http://tempuri....', 1, 0)
#1 /var/www/mtes/public_html/application/controllers/bank_api_pnb.php(146): SoapClient->__soapCall('RemittanceServi...', Array)
#2 [internal function]: Bank_api_pnb->test()
#3 /var/www/mtes/public_html/system/core/CodeIgniter.php(359): call_user_func_array(Array, Array)
#4 /var/www/mtes/public_html/index.php(220): require_once('/var/www/mtes/p...')
#5 main
【问题讨论】:
try // ... catch (SoapFault $e) echo $e->getMessage (); # 检查错误信息 它说:错误的请求。faultstring
和 getMessage()
相同。
你有代理服务器吗?我建议你使用 Fiddler 捕获 HTTP 请求,然后检查服务器响应。
从您的请求中删除“?WSDL”,然后重试。添加在 GET 请求中用于拉下 WSDL 以便您可以实现它。如果您已经知道不应出现在 URL 中的方法。
@Brian:我做到了。现在我收到了这个错误:SOAP-ERROR: Parsing WSDL: Couldn't load from URL. Premature end of data in tag html
【参考方案1】:
SoapClient 的重点是将调用转换为 xml;所以你不应该手动执行此操作。试试这个:
try
$client = new SoapClient("http://ip_add/something.asmx?WSDL", array("trace" => true, 'exceptions' => 1));
$result = $client->RemittanceService(array(
'CreditTxnMessage' => array(
'Corporate_UID' => 66666,
'Mandate_Type' => 'P',
'MICR_No' => null,
/* you get the idea */
'Beneficiary_Contact_No' => '',
'Beneficiary_Bank_Name' => 'PNB'
)
));
highlight_string($client->__getLastRequest());
catch(SoapFault $fault)
die("SOAP Fault:<br />fault code: $fault->faultcode, fault string: $fault->faultstring");
参数的确切格式及其名称将在 WSDL 中指定。
【讨论】:
终于,我得到了解决方案。谢谢。【参考方案2】:通常,当消息格式不正确(无效的标头、正文等)并因此无法解析文档时,会返回对 SOAP 请求的Bad Request
响应。首先尝试从SoapVar
中删除 XML 版本声明,看看它是否解决了问题(删除下面的行):
<?xml version="1.0" encoding="UTF-8"?>
或者,您可以随时在 SoapUI 等工具中测试您的 Soap 请求,以确保它们正常工作,然后完成您的代码。如果它在 SoapUI 中不起作用,则意味着请求有问题。尝试修改 WS 并确保您以正确的格式发送所有内容(例如,您可能需要进行身份验证?SoapHeader?..)
【讨论】:
我试图从SOAP
消息中删除以上行。不,它给了我这个错误:An exception is thrown by the Orchestration schedule
我无法在SOAPUI
上查看它,因为我们的客户端仅限制 SOAP 访问我们服务器的 IP 地址。【参考方案3】:
我不熟悉 PHP,但试试这个。
$Request = '<RemittanceService xmlns="http://tempuri.org/">
<CreditTxnMessage xmlns="http://my_url">
<Corporate_UID xmlns="">66666</Corporate_UID>
<Mandate_Type xmlns="">P</Mandate_Type>
<MICR_No xsi:nil="true" xmlns="" />
<Instrument_No xsi:nil="true" xmlns="" />
<Remitter_Address1 xmlns="">285 enfiled pl</Remitter_Address1>
<Remitter_Address2 xmlns="">mississauga</Remitter_Address2>
<Remitter_Address3 xmlns="">16y2n4</Remitter_Address3>
<Remitter_Country xmlns="">Canada</Remitter_Country>
<Remitter_ZIP_Code xsi:nil="true" xmlns="" />
<Remitter_EmailID xsi:nil="true" xmlns="" />
<Remitter_Contact_No xmlns="" />
<Beneficiary_ZIP_Code xsi:nil="true" xmlns="" />
<Beneficiary_EmailID xsi:nil="true" xmlns="" />
<Beneficiary_Contact_No xmlns="" />
<Beneficiary_Bank_Name xmlns="">PNB</Beneficiary_Bank_Name>
</CreditTxnMessage>
</RemittanceService>';
$result = $client->__doRequest($Request, "http://ip_add/something.asmx", "RemittanceService", soap_1_2, 0);
【讨论】:
我使用了SOAP_1_1
,我收到了这样的回复:<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>Server did not recognize the value of HTTP Header SOAPAction: RemittanceService.</faultstring><detail /></soap:Fault></soap:Body></soap:Envelope>
【参考方案4】:
我不确定 SoapVar 是如何工作的,但我建议不要将原始 XML 传递给 SoapClient。我会尝试在 PHP 数组中重新创建 XML 结构(我知道这很痛苦),特别是因为 XML 出现在堆栈跟踪中:
$params = array(
"RemittanceService" => array("xmlns"=>"http://tempuri.org/", "_" => array(
"CreditTxnMessage" => array("xmlns" => "http://my_url", "_" => array(
"Corporate_UID" => array("xmlns" => "", "_" => 66666),
"Mandate_Type" => array("xmlns" => "", "_" => "P"),
"MICR_No" => array("xsi:nil" => "true", "xmlns" => ""),
// and so on...
))
))
);
另外,您可能应该在 SOAPClient 的构造函数中指定 SOAP 版本(SOAP_1_1
或 SOAP_1_2
):
$client = new SoapClient("http://ip_add/something.asmx?WSDL", array('soap_version' => SOAP_1_2, "trace" => true, 'exceptions' => 1));
另外,__soapCall()
中的参数数组对格式非常挑剔。请尝试以下操作:
$result = $client->__soapCall('RemittanceService', array('parameters' => $params));
甚至:
$result = $client->__soapCall('RemittanceService', $params);
我基本上是在猜测问题是什么,所以这不是一个非常彻底的解决方案。您也可以尝试在 SO 上寻找其他地方。例如,this answer 使用 SoapVar。
【讨论】:
以上是关于SOAP:HTTP 错误请求的主要内容,如果未能解决你的问题,请参考以下文章
在 SOAP 请求 .NET CORE 2.2 上发送的 Http.WinHttpException。收到的消息是意外的或格式错误