.htaccess SOAP:HTTP错误请求

mm5n2pyu  于 6个月前  发布在  其他
关注(0)|答案(5)|浏览(59)

我在请求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}

hivapdat

hivapdat1#

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中指定。

oiopk7p5

oiopk7p52#

一般来说,当消息的格式不正确(无效的头,体,..)时,会返回对SOAP请求的Bad Request响应,因此无法解析文档。首先,尝试从SoapVar中删除XML版本声明,看看它是否解决了问题(删除下面的行):

<?xml version="1.0" encoding="UTF-8"?>

字符串
或者,你可以在SoapUI等工具中测试你的Soap请求,以确保它们工作,然后完成你的代码。如果它在SoapUI中不工作,这意味着请求有问题。尝试修改WS,并确保你以正确的格式发送所有内容(例如,也许你需要身份验证?SoapHeader?..)

41zrol4v

41zrol4v3#

我对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);

字符串

js81xvg6

js81xvg64#

我不确定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_1SOAP_1_2):

$client = new SoapClient("http://ip_add/something.asmx?WSDL", array('soap_version' => SOAP_1_2, "trace" => true, 'exceptions' => 1));


此外,__soapCall()中的arguments数组对格式非常挑剔。请尝试以下操作:

$result = $client->__soapCall('RemittanceService', array('parameters' => $params));


或者甚至:

$result = $client->__soapCall('RemittanceService', $params);


我基本上是在猜测问题是什么,所以这不是一个非常彻底的解决方案。你也可以尝试在SO上的其他地方寻找。例如,this answer使用SoapVar。

xienkqul

xienkqul5#

我的解决方案是在构造函数SoapClient选项中使用“SOAP_1_2”:
'soap_version' => SOAP_1_2

相关问题