2015-06-26 10 views
10

L'errore viene visualizzato dopo aver richiesto la chiamata SOAP.SOAP: HTTP Bad Request

fault code: HTTP, fault string: Bad Request

È questo il messaggio male formata?

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}"); 
} 

Non so che cosa c'è che non va qui.

Stack Trace

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(); # Controllare l'errore msg } – PHPJungle

+0

Dice: Richiesta non valida. 'faultstring' e' getMessage() 'sono gli stessi. –

+0

Hai un server proxy?Suggerisco di usare Fiddler per acquisire la richiesta HTTP, quindi controllare la risposta del server. – PHPJungle

risposta

5

L'intero punto di SoapClient è convertire le chiamate in xml; quindi non dovresti farlo manualmente. Prova invece:

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}"); 
} 

Il formato esatto dei parametri e il loro nome sarebbero specificati nel WSDL.

+0

Infine, ho trovato la soluzione. Grazie. –

3

In genere una risposta Bad Request a una richiesta SOAP viene restituito quando il messaggio non è in un buon formato (intestazione non valida, il corpo, ..) e per questo il documento non può essere analizzato Prima di tutto cercare di rimuovere la dichiarazione di versione XML dal vostro SoapVar e vedere se si risolve il problema (rimuovere la riga in basso):

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

In alternativa è sempre possibile testare le vostre richieste SOAP a strumenti come SoapUI per assicurarsi che essi lavorare e quindi completare il codice. Se non funziona in SoapUI significa che c'è qualcosa di sbagliato nella richiesta. Prova a rivedere il WS e assicurati di inviare tutto nel formato corretto (ad esempio forse devi autenticare? SoapHeader? ..)

+0

Ho provato a rimuovere la riga precedente dal messaggio 'SOAP'. No, w Mi sta dando questo errore: 'Un'eccezione viene generata dal programma Orchestration' –

+0

E non riesco a controllarlo su' SOAPUI' perché il nostro client ha limitato l'accesso SOAP solo all'indirizzo IP del nostro server. –

1

Non ho familiarità con PHP ma provo questo.

$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

Ho usato 'SOAP_1_1' e sto ottenendo questa risposta:' soap : client Server non ha riconosciuto il valore di SOAPAction intestazione HTTP:. RemittanceService ' –

+0

Prova a mettere un URL completo per l'azione:' "http://tempuri.org/RemittanceService "' –

1

Non sono sicuro di come funziona SoapVar, ma vorrei sconsigliare di passare XML raw a SoapClient. Vorrei provare a ricreare la struttura XML in array PHP (doloroso, lo so), tanto più che l'XML viene visualizzato nella traccia dello stack:

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

Inoltre, probabilmente si dovrebbe specificare la versione SOAP (SOAP_1_1 o SOAP_1_2) in il costruttore del SOAPClient:

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

Inoltre, la matrice argomenti in __soapCall() è piuttosto esigente circa la formattazione. Provare quanto segue:

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

O anche:

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

praticamente sto indovinando su ciò che il problema è, quindi questa non è una soluzione molto approfondita. Puoi anche provare a cercare altrove su SO. Ad esempio, this answer utilizza SoapVar.