Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Rispondere ad un XML inviato con POST

    Ciao a tutti,

    ho creato un parser XML che riceve un file XML passato con il metodo post.
    Riesco a leggerlo e a salvare le informazioni che mi servono.
    Creo un file XML con i risultati delle mie operazioni.

    Quello che non capisco come fare è ritornare a chi mi ha inviato il file un messaggio di OK o di ERRORE.
    O meglio, quello che mi piacerebbe fare è passargli il file XML che creo mentre processo le informazioni ricevute.

    Ad es:

    RICEVO:

    <root>
    <Metodo>Scrivi</Metodo>
    <Nome>Ale</Nome>
    <Cognome>Rossi</Cognome>
    </root>

    RISPOSTA:

    <root>
    <Metodo>Scrivi</Metodo>
    <Response>OK</Response> // oppure ERROR se l'operazione non è andata bene
    </root>

    Qualcuno sa darmi una mano? o un indirizzo dove trovare qualche informazione?
    Sono 2 giorni che cerco e non ho trovato niente di utile.

    Grazie

  2. #2
    Quale sarebbe il problema? Basta inviare il corretto content type ed il contenuto dell'XML.

    In ogni caso, perchè non usi un "protocollo" standard (es. XML-RPC, SOAP, REST)?

  3. #3
    Grazie per la risposta.. sto imparando ora ad usare questa funzionalità..

    Il problema è che quando invio il file XML ho un target che riceve il file XML attraverso uno specifico host.
    Quando devo rispondere al file che mi inviano, come rispondo se l'host può essere uno qualunque?
    O interpreto male io il funzionamento?

    IL FILE LO INVIO COSI':

    Codice PHP:
    <?php /*** SCRIPT xml_post.php invia la request xml ***/  
    $host="localhost" 
    $target="http://localhost/xmlparse/xml_receive.php" 
    $port=80 
    $timeout=60
    $protocol="HTTP/1.0" ;  
    $br="\r\n" ;    
    $xml_body=file_get_contents('example.xml');  
    $sk=fsockopen($host,$port,$errnum,$errstr,$timeout) ;  
    if(!
    is_resource($sk))
    {  
    exit(
    "Connessione fallita: ".$errnum." ".$errstr) ;  
    }  
    else
    {  
    $headers="POST ".$target." ".$protocol.$br 
    $headers.="Host: ".$host.$br 
    $headers.="Content-Type: text/xml".$br 
    $headers.="Content-Length: ".strlen($xml_body).$br.$br ;  

    fputs($sk$headers.$xml_body) ;  
    $dati="" ;  

    while (!
    feof($sk)) 
    {  
    $dati.= fgets ($sk2048);  
    }  
    }  

    fclose($sk) ;  
    echo(
    $dati) ;  
    ?>
    C'è un modo migliore per farlo?

  4. #4
    Stai facendo un errore di base sul funzionamento del protocollo HTTP.

    Per rispondere ad una richiesta HTTP, è sufficiente:

    - inviare gli header (es. con header())
    - inviare il contenuto (es. con print()/echo())

    NON devi avviare una nuova richiesta HTTP verso un'altro host.

  5. #5
    Mmm.. scusa ma non ho capito bene.

    Il codice che uso per inviare il file va bene quindi?

    All'interno del file che uso come target devo inviare i dati di risposta?

    Devo aggiungere dopo che utilizzato le informazioni in input e creato la stringa xml da dare in risposta:

    header('Content-type: text/xml');
    print($strOutput);

    ???

    Come fa a prendere le informazioni di output il client che mi ha mandato il file?

  6. #6
    Non capisco perchè non mi fa vedere gli header quando mando il comnado header(ecc. ecc.).

    Se dopo aver salvato in un file xml sul server cerco di inviarlo al client che mi ha mandato il file, non mi compare nulla, viene solo stampato a video il contenuto del file xml che ho generato ma senza i tag.

    Codice PHP:
    $XMLFile fopen($fileOutput"w") or die("can't open file");      
    fwrite($XMLFile$strOutput);  
    fclose($XMLFile);   

    header("Content-type: text/xml"); 
    header("Content-Disposition: attachment; filename=\"output.xml\""); 
    readfile($fileOutput); 
    Non dovrebbe funzionare così?

  7. #7
    Ok forse ho capito.

    Viene gestito tutto dal client che invia il file verso il server.
    Quindi la parte di invio degli header e del contenuto va messa nel file che fa il post del file?

  8. #8
    Sono riiuscito a far salvare i dati di risposta in un file. Solo che il file è HTML, a me serve XML.
    Ho messo il content-type: text/xml ma è come se non lo leggesse.

    Come invio gli header dal file di target in modo che vengano salvati nell'output che gestiscce il client che fa la chiamata?

  9. #9
    Mi scuso per il continuo invio di messaggi. Ma non riesco a venire a capo del problema.

    Invio il mio codice di modo che la situazione sia un po' più chiara:

    FILE CHE USO PER FARE IL POST:

    Codice PHP:
    <?php
    /***
    SCRIPT xml_post.php
    invia la request xml
    ***/
    $host="localhost" ;

    $target="http://localhost/xmlparse/WriteUsers.php" ;
    $port=80 ;
    $timeout=60;
    $protocol="HTTP/1.0" ;
    $br="\r\n" ;

    $xml_body=file_get_contents('example_users.xml');

    $sk=fsockopen($host,$port,$errnum,$errstr,$timeout) ;

    if(!
    is_resource($sk))
    {
    exit(
    "Connessione fallita: ".$errnum." ".$errstr) ;
    }

    else
    {
    $headers="POST ".$target." ".$protocol.$br ;
    $headers.="Host: ".$host.$br ;
    $headers.="Content-Type: text/xml".$br ;
    $headers.="Content-Length: ".strlen($xml_body).$br.$br ;

    fputs($sk$headers.$xml_body) ;
    $dati="" ;

    while (!
    feof($sk)) 
    {
    $dati.= fgets ($sk2048);
    }
    }

    fclose($sk) ;

    $fileOutput "output.xml";
    $XMLFile fopen($fileOutput"w") or die("can't open file");    
    fwrite($XMLFile$dati); 
    fclose($XMLFile);

    header("Content-Type: text/xml"true);
    header("Content-Disposition: attachment; filename=".basename($fileOutput)."");
    header("Content-Transfer-Encoding:_ binary");
    header("Content-Length: ".filesize($fileOutput)."");
    readfile($fileOutput);
    ?>
    FILE TARGET CHE PARSIFICA L'XML INVIATO:
    Codice PHP:
    <?php

    // .. funzioni per parsificare i dati 

    $strOutput "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>";
    $strOutput .= "<root>";
    $strOutput .= "<RequestID>".$x->RequestID."</RequestID>";
    $strOutput .= "<ClientID>".$x->ClientID."</ClientID>";
    $strOutput .= "<RequestedMethod>".$x->Method."</RequestedMethod>";
    $ora=time();
    $data=date('d M y - H:i:s'$ora);
    $strOutput .= "<ResponseDate>".$data."</ResponseDate>";
    $strOutput .= "<Response>".$check."</Response>";
    $strOutput .= "<ResultSet>";
    $strOutput .= "<Item>";

    // .. qui gestisco le mie informazioni

    $strOutput .= "<IdIn>".$ID."</IdIn>";
    $strOutput .= "<IdOut>".$IDNew."</IdOut>";
    $strOutput .= "<Codice>".$codice."</Codice>";
    $strOutput .= "</Item>";
    $strOutput .= "</ResultSet>";
    $strOutput .= "</root>";

    $fileOutput "output.xml";
    $XMLFile fopen($fileOutput"w") or die("can't open file"); 
       
    fwrite($XMLFile$strOutput); 
    fclose($XMLFile); 

    header("Content-Type: text/xml");
    header("Content-Disposition: attachment; filename=".basename($fileOutput)."");
    header("Content-Transfer-Encoding:_ binary");
    header("Content-Length: ".filesize($fileOutput)."");
    readfile($fileOutput);

    mysql_free_result();
    ?>
    Con questo codice quello che ottengo è il salvataggio di un file "ouput.xml", però non ha un formato XML, ma è un HTML con tutti i dati della pagina del browser e il mio xml.

    Dove sbaglio?

    Grazie

  10. #10
    Va bhe.. allora diciamo che ho risolto con questo file per postare gli xml, anche perchè non è proprio esattamente quello di cui avevo bisogno.. volevo solo capirne un po' di più..

    Il problema è che devo interfacciare il mio file che parsifica l'XML ricevuto con un'applicazione in VB che mi invia il file XML e si aspetta una risposta in questo modo:

    codice:
    If oXml.loadXML(oXmlHttp.responseText) Then
                 Me.Text10.Text = CStr(oXmlHttp.responseText)
                 oXml.Load (oXmlHttp.responseText)
    Se gli invio gli header e il file che ho salvato con la risposta XML così:

    Codice PHP:
    $fileOutput "output.xml";
    $XMLFile fopen($fileOutput"w") or die("can't open file");
       
    fwrite($XMLFile$strOutput);
    fclose($XMLFile);

    header("Content-Type: text/xml");
    header("Content-Disposition: attachment; filename=".basename($fileOutput)."");
    header("Content-Transfer-Encoding:_ binary");
    header("Content-Length: ".filesize($fileOutput)."");
    readfile($fileOutput); 
    VB non riceve nulla.

    Come devo passargli la risposta?

    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.