Как правильно получить ответ от HTTP-сервера?
От: sushko Россия  
Дата: 24.04.16 13:37
Оценка:
Есть некоторая программа (ЕГАИС УТП), кот. позволяет с собой общаться по HTTP, при этом "задать ей вопрос" можно либо "открыв" соотв. URI и получив в ответ XML с ответом, либо за'upload'ив в нее XML с вопросами с получив в ответ XML с ответом. С первым вариантом я разобрался, а вот с XML upload беда: загрузить в нее файл у меня получается, программа факт загрузки файла отрабатывает корректно, но я никак не могу сообразить, как именно мне получить ее ответ в XML. Подскажите?

BOOL CEgais::PostXml(LPCTSTR szUri, CString sXml, CString &sError)
{
    DWORD dwResult = 0;

//  opening internet connection 
    sError.Empty();
    CInternetSession theSession("abcdef");

    CHttpConnection *pConnection = NULL;
    try
    {
        pConnection = theSession.GetHttpConnection
                                        (
                                        GetAddress(),
                                        INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE,
                                        GetPort()
                                        );
    }
    catch (CInternetException *e)
    {
        char szError[1024];
        e->GetErrorMessage(szError, 1024);
        sError = "Не удалось соединиться с программой ЕГАИС-транспорт: " + (CString)szError;
        return FALSE;
    }

//  opening request
    CHttpFile *pFile = pConnection->OpenRequest
                                        (
                                        "POST",
                                        szUri
                                        );
    if (NULL == pFile)
    {
        sError.Format("Не удалось открыть соединение с http://%s:%d/%s", GetAddress(), GetPort(), szUri);
        pConnection->Close();
        delete pConnection;
        return FALSE;
    }

//  adding request headers
    if (!pFile->AddRequestHeaders("Content-type: multipart/form-data; boundary=1758722263496359", HSR_SYNC|HSR_INITIATE))
    {
        sError = "Не удалось добавить HTTP-заголовок при отправке запроса в ЕГАИС: " + GetSystemError(GetLastError());
        pFile->Close();
        delete pFile;
        pFile = NULL;
        pConnection->Close();
        delete pConnection;
        return FALSE;
    }

//  converting request to UTF8
    int iUtf8Length = 0;
    sXml = "\r\n--1758722263496359\r\nContent-Disposition: form-data; name=\"xml_file\";filename=\"data.xml\";\r\n\r\n" + sXml + "\r\n--1758722263496359--";
    char *utf8Contents = AnsiToUtf8((char*)(LPCTSTR)sXml, &iUtf8Length);

//  sending the request to the server
    try
    {
        pFile->SendRequestEx(iUtf8Length-1);
    }
    catch (CInternetException *e)
    {
        char szError[1024];
        e->GetErrorMessage(szError, 1024);
        sError = "Не удалось отправить запрос программе ЕГАИС-транспорт: " + (CString)szError;
        pFile->Close();
        delete pFile;
        pFile = NULL;
        pConnection->Close();
        delete pConnection;
        free(utf8Contents);
        utf8Contents = NULL;
        return FALSE;
    }

//  writing data to the request
    try
    {
        pFile->Write(utf8Contents, iUtf8Length);
    }
    catch (CException *e)
    {
        char szError[1024];
        e->GetErrorMessage(szError, 1024);
        sError = "Не удалось соединиться с программой ЕГАИС-транспорт: " + (CString)szError;
        pFile->Close();
        delete pFile;
        pFile = NULL;
        pConnection->Close();
        delete pConnection;
        free(utf8Contents);
        utf8Contents = NULL;
        return FALSE;
    }

//  closing connection and exiting
    pFile->EndRequest();
    pFile->Close();
    delete pFile;
    pFile = NULL;
    pConnection->Close();
    delete pConnection;
    pConnection = NULL;
    free(utf8Contents);
    utf8Contents = NULL;
    return TRUE;
}
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.