Относительно дескриптора для строки ответа SOAP - PullRequest
0 голосов
/ 16 сентября 2011

Я пытаюсь отправить SOAP-запрос в веб-сервис и получить ответ обратно, используя C. Я был перенаправлен на пример «simplepost.c», и с его помощью я могу отправить и распечатать ответ SOAP из веб-сервис в моей командной строке. Но вместо того, чтобы печатать ответ на экране, мне нужен дескриптор строки ответа, чтобы я мог извлечь значения внутри тегов SOAP. У меня написана следующая программа отправки и получения, но я не могу получить правильный ответ, что означает, что существует проблема с отправкой или получением. Если кто-то может помочь мне определить, как именно я могу достичь, чего я хочу, это было бы очень полезно. Заранее спасибо.

Мой код:

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

/* Auxiliary function that waits on the socket. */ 

int main(void)
{
  CURL *curl;
  CURLcode res;
  /* Minimalistic http request */ 
  const char *request = "<?xml version=\"1.0\" encoding=\"utf-8\"?> <S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"xmlns:tns=\"http://ThermodynamicProperties/\"><S:Body> <tns:getSpeciesInformation> <speciesSymbol>CO2</speciesSymbol> <phase>GAS</phase> </tns:getSpeciesInformation> </S:Body> </S:Envelope>";

size_t iolen;

  struct curl_slist *headerlist=NULL;
  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://thermo.sdsu.edu/servlet/ThermodynamicProperties/ThermodynamicPropertiesService");

    /* Do not do the transfer - only connect to host */ 
    curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);


    res = curl_easy_perform(curl);

    if(CURLE_OK != res)
    {
      printf("Error: %s\n", strerror(res));
      return 1;
    }

curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
    curl_easy_setopt(curl, CURLOPT_POST, 1);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);

    puts("Sending request.");
    /* Send the request. Real applications should check the iolen
     * to see if all the request has been sent */ 
    res = curl_easy_send(curl,request, strlen(request), &iolen);

    if(CURLE_OK != res)
    {
      printf("Error: %s\n", curl_easy_strerror(res));
      return 1;
    }
    puts("Reading response.");

    /* read the response */ 

printf("ok1 \n");
      char buf[10240];
  res = curl_easy_recv(curl, buf, 10240, &iolen);
 printf("ok2 \n");
      if(CURLE_OK != res)

     {
printf("Error: %s\n", strerror(res));

       }
else{  printf("data %s \n", buf);


    }

    /* always cleanup */ 
    curl_easy_cleanup(curl);
  }
  return 0;
}

Ответ, который я получаю: Отправка запроса. Чтение ответа. ok1 OK2 Ошибка: раздел .lib в a.out поврежден

1 Ответ

0 голосов
/ 16 сентября 2011

Я предлагаю вам использовать gsoap , потому что он имеет дело со всей отправляющей / получающей частью, а также анализирует и создает мыльные сообщения.

Если вы хотите работать с curl и ручным анализомнаверняка у вас неправильный тип.Это должно быть

Content-Type:text/xml

в SOAP 1.1 или

Content-Type: application/soap+xml;

в SOAP 1.2, и я видел, что без правильного типа контента многие веб-службы даже не отвечают.

Но действительно стоит подумать об использовании инструмента для создания заглушек и просто сосредоточиться на логике программы.Написание разбора вручную вообще плохо.

...