gpt4 book ai didi

c - 使用 libcurl 发送 SOAP 请求

转载 作者:行者123 更新时间:2023-11-30 16:00:52 27 4
gpt4 key购买 nike

我可以理解使用 libcurl 发送 REST 请求的简单 sendrecv 示例。现在我想使用 libcurl 发送 SOAP 请求。我更改了 REST 请求代码以实现相同的目的,但代码不起作用。我的代码是:

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

/* Auxiliary function that waits on the socket. */
static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
{
struct timeval tv;
fd_set infd, outfd, errfd;
int res;

tv.tv_sec = timeout_ms / 1000;
tv.tv_usec= (timeout_ms % 1000) * 1000;

FD_ZERO(&infd);
FD_ZERO(&outfd);
FD_ZERO(&errfd);

FD_SET(sockfd, &errfd); /* always check for error */

if(for_recv)
{
FD_SET(sockfd, &infd);
}
else
{
FD_SET(sockfd, &outfd);
}

/* select() returns the number of signalled sockets or -1 */
res = select(sockfd + 1, &infd, &outfd, &errfd, &tv);
return res;
}

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>";
curl_socket_t sockfd; /* socket */
long sockextr;
size_t iolen;

curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://thermo.sdsu.edu/servlet/ThermodynamicProperties/ThermodynamicPropertiesService");
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request);
/* 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;
}

/* Extract the socket from the curl handle - we'll need it for waiting.
* Note that this API takes a pointer to a 'long' while we use
* curl_socket_t for sockets otherwise.
*/
res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockextr);

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

sockfd = sockextr;

/* wait for the socket to become ready for sending */
if(!wait_on_socket(sockfd, 0, 60000L))
{
printf("Error: timeout.\n");
return 1;
}

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

我觉得我在构建 SOAP 请求时做得不正确。任何帮助都会很棒,因为这对我来说是一个全新的领域。

最佳答案

SOAP 消息比 REST 消息复杂得多。

我的建议是下载更好的 SOAP 实用程序之一,例如“SOAPUI”,并使用它来构建和测试格式良好的 SOAP 请求。一旦您有了工作请求,您就可以将其粘贴到您的 C 程序中。

此外,如果您要做的事情比发送简单的预格式化请求更复杂,我建议您使用 libxml2(或 Xerces,如果您不介意 C++)之类的库来构建 SOAP 消息。

SOAPUI 是一个基于 java 的 SOAP 服务测试实用程序。它可以根据给定的 WSDL 生成消息、生成响应、浏览消息等。更多信息请点击:SOAPUI

关于c - 使用 libcurl 发送 SOAP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7375800/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com