SOAP-запрос и ответ Чтение из файла и в файл с использованием libcurl - C

Я пытаюсь отправить запрос SOAP из файла xml и отправить в службу SOAP, а затем прочитать ответ, сохраняя его в файл, используя libcurl.

Пример запроса в файле xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:olm="http://127.0.0.1:1090/services/olmDSMN">
   <soapenv:Header/>
   <soapenv:Body>
      <olm:getAllCommercialProducts soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
   </soapenv:Body>
</soapenv:Envelope>

Код libcurl, который я пытаюсь использовать для чтения и записи, выглядит следующим образом:

#define URL "http://192.168.56.101:8088/olmDSMN"

size_t write_data(void *ptr, size_t size, size_t nmeb, void *stream)
{
    return fwrite(ptr,size,nmeb,stream);
}

size_t read_data(void *ptr, size_t size, size_t nmeb, void *stream)
{
    return fread(ptr,size,nmeb,stream);
}

int sendMessage (char * inFile, char * outFile) {
    //writing to file initially
    FILE * rfp = fopen(inFile, "r");
    if(!rfp) {
        perror("Read File Open:");
//        exit(0);
    }

    FILE * wfp = fopen(outFile, "w+"); //File pointer to write the soap response
    if(!wfp) {
        perror("Write File Open:");
//        exit(0);
    }

    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_data);  //Reads xml file to be sent via POST operationt
        curl_easy_setopt(curl, CURLOPT_READDATA, rfp); 
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);  //Gets data to be written to file
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, wfp);  //Writes result to file

        res = curl_easy_perform(curl);

        curl_easy_cleanup(curl);

    return 1;
    }
}

На данный момент вышеописанное не работает. Когда функция вызывается, она просто ждет (как будто ждет ответа, который никогда не приходит). Я только изучаю libcurl, поэтому уверен, что многое сделал неправильно. Я действительно собрал пару разных руководств, чтобы заставить его делать то, что я хочу. Будем очень благодарны любой помощи.


person Matthew McNaughton    schedule 11.11.2010    source источник
comment
Что произойдет, если вы попробуете другой URL?   -  person chrisaycock    schedule 11.11.2010
comment
Ну, это URL-адрес веб-службы. Так что это не помогло бы много, чтобы изменить адрес.   -  person Matthew McNaughton    schedule 11.11.2010
comment
Попробуйте установить параметр CURLOPT_VERBOSE, чтобы видеть, что происходит.   -  person caf    schedule 11.11.2010


Ответы (2)


Итак, после долгих возни и объединения кода из разных примеров я понял, как выполнить вышеуказанную задачу. См. код ниже:

#include <stdio.h>
#include <string.h>
#include <curl/curl.h>

#define URL "http://192.168.56.101:8088/olmDSMN"

size_t write_data(void *ptr, size_t size, size_t nmeb, void *stream)
{
    return fwrite(ptr,size,nmeb,stream);
}

size_t read_data(void *ptr, size_t size, size_t nmeb, void *stream)
{
    return fread(ptr,size,nmeb,stream);
}

int sendMessage (char * inFile, char * outFile) {
    //writing to file initially
    FILE * rfp = fopen(inFile, "r");
    if(!rfp) {
        perror("Read File Open:");
//        exit(0);
    }

    FILE * wfp = fopen(outFile, "w+"); //File pointer to write the soap response
    if(!wfp) {
        perror("Write File Open:");
//        exit(0);
    }

    struct curl_slist *header = NULL;
    header = curl_slist_append (header, "Content-Type:text/xml");
    header = curl_slist_append (header, "SOAPAction: myur1");
    header = curl_slist_append (header, "Transfer-Encoding: chunked");
    header = curl_slist_append (header, "Expect:");
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_data);  //Reads xml file to be sent via POST operationt
        curl_easy_setopt(curl, CURLOPT_READDATA, rfp); 
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);  //Gets data to be written to file
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, wfp);  //Writes result to file
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)-1);
//        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_easy_setopt(curl, CURLOPT_VERBOSE,1L);            
        res = curl_easy_perform(curl);

        curl_easy_cleanup(curl);

        return 1;
    }
}
person Matthew McNaughton    schedule 11.11.2010

Предполагая, что ваш сервер SOAP ожидает HTTP POST, вам необходимо:

  • Установите параметр CURLOPT_POST;
  • Установите заголовок Content-Type Content-Type: application/soap+xml с помощью CURLOPT_HTTPHEADER;
  • Установите размер вашего XML-запроса, используя параметр CURLOPT_POSTFIELDSIZE.
person caf    schedule 11.11.2010
comment
@matthew: вместо файла xml вы можете указать мне несколько руководств по созданию запроса SOAP с использованием libcurl. - person user537670; 11.09.2011