Problema in PHP per invio file XML - RISOLTO-

Srhike

Nuovo Utente
12 Nov 2017
6
0
1
55
Salve e complimenti per il lavoro svolto, espongo il mio problema, ho una procedura in PHP per la connessione ad un web service, il lavoro è semplice invio di un file XML e elaborazione della risposta.
L'invio va effettuato con metodo POST attribuendo il contenuto del file ad una variabile, ho provato tutti i modi possibili fread, stream_get_contents, simplexml_file_upload ma ottengo sempre un PARSE ERROR, invece se spartanamente copio e incollo il contenuto del file e lo invio tra i 2 apici il tutto funziona.....allego parte codice con errore e funzionante:

PHP:
$tmpfile = $_FILES["file1"]["tmp_name"];
    $tmpfile1 = $_FILES["file1"]["name"];
    $handle = fopen($tmpfile, "rb");
    $contents = fread($handle, filesize($tmpfile));
//    $xml= simplexml_load_file($tmpfile);
//    $contents = stream_get_contents($handle);
    fclose($handle);
}  
try {
    $wsdl_url = 'https://www.mytnt.it/ResiService/ResiServiceImpl.wsdl';
    $client = new SOAPClient($wsdl_url);
       
    $params = array( 'inputXml' => $contents,);

codice funzionante

PHP:
try {
    $wsdl_url = 'https://www.mytnt.it/ResiService/ResiServiceImpl.wsdl';
    $client = new SOAPClient($wsdl_url);
       
    $params = array( 'inputXml' => '<?xml version="1.0" encoding="utf-8"?>
<shipment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="W:ExpressLabel\Internazionale\routinglabel.xsd">
  <software>,);
Grazie per l'aiuto
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.904
160
63
Lombardia
sostituisci questa parte
PHP:
    $handle = fopen($tmpfile, "rb");
    $contents = fread($handle, filesize($tmpfile));
//    $xml= simplexml_load_file($tmpfile);
//    $contents = stream_get_contents($handle);
    fclose($handle);
con questa
PHP:
$contents = implode("", file($tmpfile));
fai sapere
 
Ultima modifica:

Srhike

Nuovo Utente
12 Nov 2017
6
0
1
55
Niente da fare, mi sa che lo avevo provato, qualunque tentativo di assegnare il contenuto del XML alla stringa mi provoca l'errore PARSE ERROR FATAL ERROR.....grazie comunque :)
 

marino51

Utente Attivo
28 Feb 2013
2.904
160
63
Lombardia
potresti pubblicare l'intero errore e la riga php che lo provoca,
quanto ti ho suggerito è usato normalmente per caricare xml con i documenti destinati al 730 precompilato e funziona
 

Srhike

Nuovo Utente
12 Nov 2017
6
0
1
55
L'errore è il seguente:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><!DOCTYPE SYSTEM ".dtd"><><ParseError><Message>FATAL ERRORFATAL ERRORWARNING</Message><LineNumber></LineNumber><LinePosition></LinePosition><SourceText></SourceText></ParseError></>

questa è la risposta di errore che ricevo ma ripeto se al posto di assegnare il contenuto alla variabile faccio un copia e incolla direttamente funziona tutto quetsa è la cosa assurda
PHP:
try {
    $wsdl_url = 'https://www.mytnt.it/ResiService/ResiServiceImpl.wsdl';
    $client = new SOAPClient($wsdl_url);
        
    $params = array( 'inputXml' => $contents,);
 $return = $client->getPDFLabel($params);
    
    $return2 = $return->getPDFLabelReturn;

    if ($return2->documentCorrect == 1 && strlen($return2->binaryDocument) > 0)
in pratica documentCorrect ritorna falso se inviato via file mi da true se lo copio direttamente
 

marino51

Utente Attivo
28 Feb 2013
2.904
160
63
Lombardia
potresti usare notepad++ con il plugin xml per validare il file xml che stai inviando,

ho trovato il file wsdl e xsd poi ho scaricato un xml di esempio (non specifico per la richiesta) dal sito
ed ho provato ad inviarlo, segnala un errore "EX 12.34 GBP 0 piecelinegoods desc"

upload_2017-11-12_12-12-21.png

upload_2017-11-12_12-13-2.png

Codice:
REQUEST HEADERS ============
string(214) "POST /ResiService/services/ResiServiceImpl HTTP/1.1
Host: www.mytnt.it
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.4.9
Content-Type: text/xml; charset=utf-8
SOAPAction: "getPDFLabel"
Content-Length: 325"

REQUEST ====================
string(325) "<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://services.resi.tnt.com">
<SOAP-ENV:Body><ns1:getPDFLabel><inputXml xsi:nil="true"/></ns1:getPDFLabel></SOAP-ENV:Body></SOAP-ENV:Envelope>"

RESPONSE HEADERS ===========
string(412) "HTTP/1.1 200 OK
Date: Sun, 12 Nov 2017 11:09:05 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux) mod_jk/1.2.41
X-Frame-Options: SAMEORIGIN
Vary: Accept-Encoding,User-Agent
TNTServer: mytnt03
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/xml;charset=UTF-8
Set-Cookie: JSESSIONID-myTNT-443=HEAAKIMA; Expires=Wed, 10-Nov-2027 10:55:04 GMT; Path=/"

RESPONSE ===================
string(475) "
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing">
<soapenv:Body><p70:getPDFLabelResponse xmlns:p70="http://services.resi.tnt.com"><getPDFLabelReturn>
<documentCorrect xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<outputString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</getPDFLabelReturn>
</p70:getPDFLabelResponse>
</soapenv:Body>
</soapenv:Envelope>"
 

Srhike

Nuovo Utente
12 Nov 2017
6
0
1
55
Eccomi si avevo già usato notepad++, ho installato il plugin è provato a validare ma mi da un errore non trovando il main schema resource ( W:ExpressLabel...) ma credo sia corretto dovendolo trovare sul server del WS.
Ho notato una cosa invece le dimensioni del file XML sono pari a 3305 mentre in tutte le prove che faccio la variabile $contents mi restituisce una stringa di 3308 byte, che siano questi 3 byte a creare il problema anche se non capisco dove o cosa siano....
 

Srhike

Nuovo Utente
12 Nov 2017
6
0
1
55
Evvai risolto, grazie per avermi portato sulla strada giusta.

$contents = stream_get_contents($handle, -1, 3);

Ho eliminato i 3 byte del BOM e cosi funziona alla perfezione erano quelli a creare l'errore.

Grazie ancora :)