2013-06-11 6 views
5

ich verwendet habeCURLOPT_WRITEFUNCTION zu bekommen xml Inhalt

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 

und

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

, um die unten Ausgabe zu erhalten, aber ich brauche nur Körper Inhalt

* 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> 

-Code zu erhalten:

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

Antwort

2

Standardmäßig sollten die Header nicht mit den Body-Daten ausgegeben werden. Wenn Sie in Ihrem write_data Callback Header empfangen, bedeutet dies wahrscheinlich, dass Sie entweder die CURLOPT_HEADER Option oder die CURLOPT_WRITEHEADER Option festgelegt haben. Sie könnten versuchen, diese beiden Zurücksetzen auf Nummer sicher:

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

Wenn Sie immer noch die Header abrufen wollen, aber einfach nicht in der write_data Rückruf, können Sie einen separaten Rückruf für Ihre Kopfdaten wie folgt festgelegt:

curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_header); 

Wo write_header eine Callback-Funktion ist, ähnlich wie Ihre write_data Funktion.

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

Beachten Sie, dass es wichtig ist, dass Sie die Anzahl der geschriebenen Bytes aus diesen Callback-Funktionen zurückgeben, sonst würde curl dies als Fehler behandeln.

Wenn dies immer noch nicht funktioniert für Sie, die einzige andere Erklärung, die ich denken kann ist, dass Ihr Server eine leere Zeile vor den Header-Daten zurückgibt, so dass es scheint, als ob die Header tatsächlich Teil des Körpers sind.

Sie können leicht feststellen, ob dies der Fall ist, indem Sie eine bekannte gültige URL testen (z. B. http://www.example.com/). Wenn es dort korrekt funktioniert, wissen Sie, dass der Fehler in Ihrem Servercode und nicht im Clientcode liegt.

Nachdem Sie sich Ihren vollständigen Code angeschaut haben, kommen all die Extras, die Sie in Ihrer Ausgabe sehen, von den Optionen CURLOPT_VERBOSE (die Sie zweimal festgelegt haben) und CURLOPT_NOPROGRESS. Kommentieren Sie diese einfach und Sie erhalten eine nette, saubere Antwort mit nichts als dem Inhaltskörper.

ich auch erwähnen sollte, dass es bei der Festlegung CURLOPT_FILE keinen Sinn, es sei denn, Sie in der write_data Rückruf mit dem Strom Parameter sein werden. Wenn Sie den Rückruf CURLOPT_WRITEFUNCTION festlegen, ersetzt er die Standardausgabefunktion, sodass nichts in den Stream CURLOPT_FILE geschrieben wird, wenn Sie dies nicht selbst tun.

+0

James können Sie bitte sehen Sie sich meine Bearbeitung und sagen Sie mir was falsch ist. Danke –

+0

@Krish Ich habe meine Antwort aktualisiert. Es sieht so aus, als ob Ihr Problem nur die Protokollierungsoptionen sind, die Sie aktiviert haben - 'CURLOPT_VERBOSE' und' CURLOPT_NOPROGRESS'. –

+0

@Krish Hat dies Ihre Frage beantwortet, oder haben Sie immer noch Probleme? –