Отправка SOAP-запроса с использованием libcurl - PullRequest
0 голосов
/ 11 сентября 2011

Я мог понять примеры простого sendrecv для отправки REST-запроса с использованием libcurl.Теперь я хочу отправить запрос SOAP, используя libcurl.Я изменил код запроса 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.Любая помощь будет великолепна, так как для меня это совершенно новая область.

1 Ответ

1 голос
/ 11 сентября 2011

SOAP-сообщения намного сложнее, чем REST-сообщения.

Мой совет - скачать одну из лучших утилит SOAP, например "SOAPUI", и использовать ее для создания и тестирования правильно сформированного SOAP-запроса.Получив рабочий запрос, вы можете вставить его в свою программу на языке C.

Также я бы порекомендовал использовать такую ​​библиотеку, как libxml2 (или Xerces, если вы не возражаете против C ++), для создания сообщений SOAP, если вы делаете что-то еще.сложнее, чем отправка простого предварительно отформатированного запроса.

SOAPUI - это сервисная программа SOAP для тестирования на основе Java.Он может генерировать сообщения из заданного WSDL, генерировать ответы, просматривать сообщения и т. Д. Более подробная информация здесь: SOAPUI

...