2013-06-11 10 views
5

ho usatoCURLOPT_WRITEFUNCTION per ottenere contenuti XML

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 

e

size_t write_data(void *ptr, size_t size, size_t count, void *stream) 
{ 
    printf("%*.*s", size * count, size * count, ptr); 
} 

per ottenere il risultato al di sotto, ma ho bisogno di ottenere solo il contenuto del corpo

* About to connect() to 10.10.1.112 port 8081 (#0) 
* Trying 10.10.1.112... * connected 
* Connected to 10.10.1.112 (10.10.1.112) port 8081 (#0) 
> POST /iit_mobile/services/application?wsdl HTTP/1.1 
Host: 10.10.1.112:8081 
Accept: */* 
Content-type:application/soap+xml; charset=utf-8; action="http://wsdlclass.wsdlcreat.sims.test.com/userloginMethod" 
Content-Length: 629 

< HTTP/1.1 200 OK 
< Server: Apache-Coyote/1.1 
< Content-Type: application/soap+xml;charset=utf-8 
< Transfer-Encoding: chunked 
< Date: Tue, 11 Jun 2013 13:22:35 GMT 
< 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 338 0 338 0  0  36  0 --:--:-- 0:00:09 --:--:--  0* Connection #0 to host 10.10.1.112 left intact 

* Closing connection #0 
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><userloginMethodResponse xmlns="http://wsdlclass.wsdlcreat.sims.test.com"/></soapenv:Body></soapenv:Envelope> 

Codice:

curl = curl_easy_init(); 
if(curl) 
{ 

    out_fd = fopen (filename, "w"); 
    curl_easy_setopt(curl, CURLOPT_FILE, out_fd); 

    headers = curl_slist_append(headers, "Content-type:application/soap+xml; charset=utf-8; action=\"http://wsdlclass.wsdlcreat.sims.test.com/login\""); 
    curl_easy_setopt(curl, CURLOPT_URL, tmpbuff); 
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); 
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); 

    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 


    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, buffer_size); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, buffer); 

    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, Timeout); 
    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER,errmsg); 

    printf("The Server%s:Performing Transaction.....\n",__func__); 
    res = curl_easy_perform(curl); 
    printf("res=after culreasey perform%d\n",res); 
    curl_slist_free_all(headers); 
    curl_easy_cleanup(curl); 

    fclose(out_fd); 
} 

risposta

2

Per impostazione predefinita le intestazioni non devono essere scritte con i dati del corpo. Se stai ricevendo le intestazioni nella tua richiamata write_data, probabilmente significa che hai impostato l'opzione CURLOPT_HEADER o l'opzione CURLOPT_WRITEHEADER. Si potrebbe provare a ripristinare sia di quelli per essere al sicuro:

curl_easy_setopt(curl, CURLOPT_HEADER, 0L); 
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, 0L); 

Se ancora desidera recuperare le intestazioni, ma non solo nel write_data richiamata, è possibile impostare una richiamata separata per i dati di intestazione come questo:

curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_header); 

Dove write_header è una funzione di callback, proprio come la vostra funzione write_data.

size_t write_header(void *ptr, size_t size, size_t count, void *stream) 
{ 
    printf("HEADER: %*.*s", size * count, size * count, ptr); 
    return count*size; 
} 

Nota che è importante che restituisce il numero di byte scritti da queste funzioni di callback altrimenti ricciolo tratterebbe che come un errore.

Se questo non funziona ancora, l'unica altra spiegazione che posso pensare è che il server restituisce una riga vuota prima dei dati di intestazione, facendo sembrare che le intestazioni siano effettivamente parte del corpo.

È facile verificare se questo è il caso testando un url valido noto (ad esempio http://www.example.com/). Se funziona correttamente lì, allora sai che il difetto è nel tuo codice server e non nel codice client.

Dopo aver esaminato il codice completo, però, tutto questo materiale extra che stai vedendo in uscita proviene dalla CURLOPT_VERBOSE opzioni (che hai impostato due volte), e CURLOPT_NOPROGRESS opzione. Basta commentare quelli fuori e si dovrebbe ottenere una bella risposta pulita con nient'altro che il contenuto del corpo.

Vorrei anche ricordare che non c'è nessun punto nella creazione CURLOPT_FILE a meno che non si sta andando ad essere utilizzando il flusso parametro nel write_data callback. Quando imposti il ​​callback CURLOPT_WRITEFUNCTION, sostituisce la funzione di output predefinita, quindi nulla verrà scritto sul flusso CURLOPT_FILE a meno che tu non lo faccia tu.

+0

James, per favore, puoi dare un'occhiata alla mia modifica e dirmi cosa c'è di sbagliato in essa. Grazie –

+0

@Krish Ho aggiornato la mia risposta. Sembra che il tuo problema siano solo le opzioni di registrazione che hai abilitato: 'CURLOPT_VERBOSE' e' CURLOPT_NOPROGRESS'. –

+0

@Krish Questo ha risposto alla tua domanda o hai ancora problemi? –

Problemi correlati