【问题标题】:Incomplete response string from server in implementing POST-requests执行 POST 请求时来自服务器的不完整响应字符串
【发布时间】:2014-01-07 22:57:43
【问题描述】:

我正在编写向服务器发送 POST 请求并从中获取答案的程序。 (使用 curl 库)(OS Linux、Red Hat Linux 3.2.2.-5)。有时我看到,来自服务器的响应仅包含消息的第二部分。 (我打印 _sResponse 有时我会看到完整的消息(更频繁),有时会看到损坏的消息(只有最后一部分)。

Class CurlSoapHandler
{
……..

static std::string _sResponse;
static std::string GetResponse() {return _sResponse;}


static size_t write_data(char *ptr, size_t size, size_t count, std::string *buffer)
{
    int result = 0;
    if (buffer != NULL)
    {
        std::string tmp_buffer(ptr, size * count);
        _sResponse = tmp_buffer;
        result = size * count;
    }
    else
{
    std::cout<<"Buffer is not OK!"<<std::endl;
    }    
            return result;
   }

};

void CurlSoapHandler::DoRequest(const std::string& sRequest, std::string& sResponse)
{
    CURL* _CURL;
CURLcode res;
    struct curl_slist *headerlist=NULL;
    headerlist = curl_slist_append(headerlist, "Content-Type:text/xml");
    curl_global_init(CURL_GLOBAL_ALL);
    _CURL = curl_easy_init();
    if(_CURL)
    {
        curl_easy_setopt( _CURL, CURLOPT_URL, ttp://10.10.10.11:8083/Server/Server.asmx);

        curl_easy_setopt( _CURL, CURLOPT_USERPWD, "user@password");
        curl_easy_setopt( _CURL, CURLOPT_POSTFIELDS, sRequest.c_str());
        curl_easy_setopt( _CURL, CURLOPT_HTTPHEADER, headerlist);

        curl_easy_setopt( _CURL, CURLOPT_TIMEOUT, 20);

        curl_easy_setopt( _CURL, CURLOPT_WRITEFUNCTION, CurlSoapHandler::write_data);
        res = curl_easy_perform(_CURL);
        sResponse = GetResponse(); 
        if(res != CURLE_OK)
        {   
            std::cerr<<"CURL message: "<<curl_easy_strerror(res)<<std::endl;

        }
        curl_easy_cleanup(_CURL);
    }
    else
    {
        std::cout<<"Curl initialization problem!"<<std::endl;
    }
  curl_global_cleanup();
  curl_slist_free_all (headerlist);
     }

我不知道它为什么会发生。有人有想法吗? (例如,可能需要设置一些 curl 选项)。我如何确定它的原因并了解它是否是我的应用程序的问题。我使用 tcpdump 实用程序捕获了流量(我在我的虚拟机 (VMWARe) 上运行它)并在转储中看到了完整的消息。所以,我认为服务器发送了正确的响应。提前致谢!

【问题讨论】:

  • 你需要在你的write函数中积累数据。对于同一个请求,它会被多次调用。
  • 非常感谢您的帮助!但我不明白如何在我的代码中实现它。
  • 创建一个请求类,在一个类中有std::string result成员。使您的 write 函数成为该类的方法。每次调用时,请执行result += buffer
  • 非常感谢!所以,我应该为一个请求调用两次 write 函数,对吗?
  • 我现在调用了两次,在我看来问题已经消失了。

标签: c++ linux curl


【解决方案1】:

只需将_sResponse = tmp_buffer; 替换为_sResponse += tmp_buffer; 就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2020-11-19
    • 2017-11-12
    • 1970-01-01
    • 2017-09-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多