2010-11-11 75 views
2

我試圖從XML文件發送SOAP請求併發送到SOAP服務,然後使用libcurl將其保存到文件中時讀取響應。SOAP請求和響應使用libcurl讀取和寫入文件 - C

在一個XML文件中的要求範例如下:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:olm="http://127.0.0.1:1090/services/olmDSMN"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <olm:getAllCommercialProducts soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
    </soapenv:Body> 
</soapenv:Envelope> 

我試圖使用,使讀寫libcurl的代碼如下:

#define URL "http://192.168.56.101:8088/olmDSMN" 

size_t write_data(void *ptr, size_t size, size_t nmeb, void *stream) 
{ 
    return fwrite(ptr,size,nmeb,stream); 
} 

size_t read_data(void *ptr, size_t size, size_t nmeb, void *stream) 
{ 
    return fread(ptr,size,nmeb,stream); 
} 

int sendMessage (char * inFile, char * outFile) { 
    //writing to file initially 
    FILE * rfp = fopen(inFile, "r"); 
    if(!rfp) { 
     perror("Read File Open:"); 
//  exit(0); 
    } 

    FILE * wfp = fopen(outFile, "w+"); //File pointer to write the soap response 
    if(!wfp) { 
     perror("Write File Open:"); 
//  exit(0); 
    } 

    CURL *curl; 
    CURLcode res; 

    curl = curl_easy_init(); 
    if(curl) { 
     curl_easy_setopt(curl, CURLOPT_URL, URL); 
     curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_data); //Reads xml file to be sent via POST operationt 
     curl_easy_setopt(curl, CURLOPT_READDATA, rfp); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); //Gets data to be written to file 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, wfp); //Writes result to file 

     res = curl_easy_perform(curl); 

     curl_easy_cleanup(curl); 

    return 1; 
    } 
} 

在上述時間不起作用。當函數被調用時只是等待(就像等待一個永遠不會到來的響應一樣)。我只是在學習libcurl,所以我確定我做了很多不正確的事情。我真的在拼湊一些不同的教程來讓它做我想做的事。任何援助將不勝感激。

+0

如果您嘗試使用其他網址,會發生什麼情況? – chrisaycock 2010-11-11 01:57:34

+0

那麼,這是網絡服務的網址。所以改變地址並沒有多大幫助。 – 2010-11-11 02:30:32

+0

嘗試設置'CURLOPT_VERBOSE'選項,以便您可以看到發生了什麼。 – caf 2010-11-11 03:56:25

回答

4

好吧,所以在整個負載擺弄和拼湊不同示例中的代碼之後,我已經想出瞭如何執行上述任務。請參閱以下代碼:

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

#define URL "http://192.168.56.101:8088/olmDSMN" 

size_t write_data(void *ptr, size_t size, size_t nmeb, void *stream) 
{ 
    return fwrite(ptr,size,nmeb,stream); 
} 

size_t read_data(void *ptr, size_t size, size_t nmeb, void *stream) 
{ 
    return fread(ptr,size,nmeb,stream); 
} 

int sendMessage (char * inFile, char * outFile) { 
    //writing to file initially 
    FILE * rfp = fopen(inFile, "r"); 
    if(!rfp) { 
     perror("Read File Open:"); 
//  exit(0); 
    } 

    FILE * wfp = fopen(outFile, "w+"); //File pointer to write the soap response 
    if(!wfp) { 
     perror("Write File Open:"); 
//  exit(0); 
    } 

    struct curl_slist *header = NULL; 
    header = curl_slist_append (header, "Content-Type:text/xml"); 
    header = curl_slist_append (header, "SOAPAction: myur1"); 
    header = curl_slist_append (header, "Transfer-Encoding: chunked"); 
    header = curl_slist_append (header, "Expect:"); 
    CURL *curl; 
    CURLcode res; 

    curl = curl_easy_init(); 
    if(curl) { 
     curl_easy_setopt(curl, CURLOPT_URL, URL); 
     curl_easy_setopt(curl, CURLOPT_POST, 1L); 
     curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_data); //Reads xml file to be sent via POST operationt 
     curl_easy_setopt(curl, CURLOPT_READDATA, rfp); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); //Gets data to be written to file 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, wfp); //Writes result to file 
     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header); 
     curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)-1); 
//  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); 
     curl_easy_setopt(curl, CURLOPT_VERBOSE,1L);    
     res = curl_easy_perform(curl); 

     curl_easy_cleanup(curl); 

     return 1; 
    } 
} 
0

。假定SOAP服務器需要一個HTTP POST,您需要:

  • 設置CURLOPT_POST選項;
  • 使用CURLOPT_HTTPHEADER設置Content-Type標頭Content-Type: application/soap+xml;
  • 使用CURLOPT_POSTFIELDSIZE選項設置XML請求的大小。
+0

@matthew:您可以引導我使用libcurl創建SOAP請求的一些教程,而不是xml文件。 – user537670 2011-09-11 02:48:17