2011-09-11 209 views
0

我可以理解使用libcurl發送REST請求的簡單sendrecv示例。現在我想用libcurl發送一個SOAP請求。我已經更改了REST請求代碼以實現相同,但代碼無法正常工作。我的代碼是:使用libcurl發送SOAP請求

#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

SOAP消息比REST消息複雜得多。

我的建議是下載一個更好的SOAP實用程序,如「SOAPUI」,並使用它來構建和測試格式良好的SOAP請求。一旦你有工作要求,你可以將它粘貼到你的C程序中。

另外,如果您正在執行比發送簡單的預格式化請求更復雜的任何內容,我會推薦使用類似libxml2的庫(或Xerces,如果您不介意C++)來構建SOAP消息。

SOAPUI是一個基於java的測試工具SOAP服務。它可以從給定的WSDL生成消息,生成響應,瀏覽消息等。 更多的信息在這裏:SOAPUI

+0

謝謝你的回覆....我很難找到一個或兩個SOAP請求的例子,他們使用自己的頭。 「SOAPUI」的功能是什麼? – user537670

+0

另外我正在一個Linux平臺上工作,它沒有GUI。 SOAPUI如何幫助我? – user537670