2013-06-11 13 views
5

użyłemCURLOPT_WRITEFUNCTION aby uzyskać zawartość XML

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 

i

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

dostać wyjście poniżej, ale muszę się tylko zawartość,

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

Kod:

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

Odpowiedz

2

Domyślnie nagłówki nie powinny być zapisywane wraz z danymi obiektu. Jeśli odbierasz nagłówki w swoim zgłoszeniu zwrotnym write_data, prawdopodobnie oznacza to, że masz ustawioną opcję CURLOPT_HEADER lub CURLOPT_WRITEHEADER. Można spróbować zresetować oba te pewności:

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

Jeśli nie nadal chcesz pobrać nagłówki, ale po prostu nie w write_data zwrotnego można ustawić osobny zwrotnego dla danych nagłówka, takich jak ten:

curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_header); 

Gdzie write_header jest funkcją zwrotną, podobnie jak funkcja 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; 
} 

Należy pamiętać, że jest to ważne, aby powrócić liczbę zapisanych bajtów z tych funkcji zwrotnych inaczej curl potraktuje to jako błąd.

Jeśli to nadal nie działa, jedynym możliwym wyjaśnieniem jest to, że serwer zwraca pustą linię przed danymi nagłówka, dzięki czemu wydaje się, że nagłówki są częścią ciała.

Łatwo sprawdzić, czy tak jest, testując pod znanym poprawnym adresem URL (na przykład http://www.example.com/). Jeśli działa tam poprawnie, to wiesz, że błąd leży w kodzie serwera, a nie w kodzie klienta.

Po obejrzeniu pełnego kodu, wszystkie dodatkowe elementy, które widzisz w wynikach pochodzą z opcji CURLOPT_VERBOSE (które ustawiłeś dwukrotnie) i opcji CURLOPT_NOPROGRESS. Po prostu skomentuj te i powinieneś uzyskać ładną, czystą odpowiedź bez niczego oprócz treści treści.

Należy również wspomnieć, że nie ma sensu w tworzeniu CURLOPT_FILE chyba że masz zamiar zostać za pomocą strumienia parametr w write_data zwrotnego. Po ustawieniu funkcji zwrotnej CURLOPT_WRITEFUNCTION zastępuje ona domyślną funkcję wyjściową, więc nic nie zostanie zapisane w strumieniu CURLOPT_FILE, chyba że zrobisz to sam.

+0

James, czy mógłbyś spojrzeć na moją edycję i powiedzieć mi, co w niej jest nie tak. Dzięki –

+0

@Krish Zaktualizowałem swoją odpowiedź. Wygląda na to, że Twoim problemem są tylko włączone opcje rejestrowania - "CURLOPT_VERBOSE" i "CURLOPT_NOPROGRESS". –

+0

@Krish Czy to już odpowiada na twoje pytanie, czy nadal masz problemy? –

Powiązane problemy