2015-06-26 2 views
10

После запроса SOAP я получаю ниже ошибки.SOAP: неверный запрос HTTP

fault code: HTTP, fault string: Bad Request

Это плохо сформированное сообщение?

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} 
+0

try {// ...} catch (SoapFault $ e) { \t echo $ e-> getMessage(); # Проверьте ошибку. Msg } – PHPJungle

+0

В ней говорится: «Плохой запрос». 'faultstring' и' getMessage() 'одинаковы. –

+0

У вас есть прокси-сервер?Я предлагаю вам использовать Fiddler для захвата HTTP-запроса, а затем проверить ответ сервера. – PHPJungle

ответ

5

Весь смысл 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.

+0

Наконец, я получил решение. Благодарю. –

3

Вообще Bad Request ответ на запрос SOAP возвращается, когда сообщение не в хорошем формате (неверный заголовок, тело, ..), и для этого документа не может анализироваться. Прежде всего попытаться удалить версию декларации XML с вашего SoapVar и посмотреть, если он исправляет эту проблему (удалить строку ниже):

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

Кроме того, вы всегда можете проверить свои запросы мыла в инструментах, таких как SoapUI, чтобы убедиться, что они работайте, а затем заполните свой код. Если это не работает в SoapUI, это значит, что с запросом что-то не так. Попробуйте пересмотреть WS и убедитесь, что вы отправляете все в правильном формате (например, возможно, вам нужно пройти аутентификацию? SoapHeader? ..)

+0

Я попытался удалить выше строку из сообщения SOAP. Нет, w Это дает мне эту ошибку: «Исключение выбрано расписанием оркестровки» –

+0

И я не могу проверить его на 'SOAPUI', потому что наш клиент ограничил доступ только SOAP к IP-адресу нашего сервера. –

1

Я не знаком с 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); 
+0

Я использовал 'SOAP_1_1' и получаю этот ответ:' мыло : Клиент сервер не распознает значение HTTP заголовка SOAPAction:. RemittanceService ' –

+0

Попробуйте положить полный URL для действия:' "http://tempuri.org/RemittanceService "' –

1

Я не уверен, как работает SoapVar, но я бы посоветовал не передавать в необработанный XML SoapClient. Я хотел бы попробовать воссоздать структуру XML в PHP массивы (болезненными, я знаю), особенно потому, что 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... 
     )) 
    )) 
); 

Кроме того, вы, вероятно, следует указать версию SOAP (SOAP_1_1 или SOAP_1_2) в конструктор из SoapClient:

$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.

Смежные вопросы