Я пытаюсь отправить 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 поврежден