Есть некоторая программа (ЕГАИС УТП), кот. позволяет с собой общаться по 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;
}