我正在尝试向Web服务发送SOAP请求并使用C接收响应。我被引导到“simplepost.c”的示例并使用它,我能够发送和打印SOAP响应我的命令行上的Web服务。但是我没有在屏幕上打印响应,而是想要一个响应字符串的句柄,以便我能够提取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 错误:a.out损坏的.lib部分
答案 0 :(得分:0)
我建议您使用gsoap,因为它处理所有发送/接收部分,并且还解析和构造soap消息。
如果您想使用curl和手动解析,请确保您的容错类型错误。它必须是
Content-Type:text/xml
SOAP 1.1或中的
Content-Type: application/soap+xml;
在SOAP 1.2中我已经看到,如果没有正确的内容类型,许多Web服务甚至都不会响应。
但是真的考虑使用工具生成存根,只关注程序的逻辑。手工编写解析通常很糟糕。