C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Как эмулировать отправку данныех формы на www-сервер при помощи WinInet / Общие вопросы / Сеть

Как эмулировать отправку данныех формы на www-сервер при помощи WinInet

Для эмуляции отправки данных формы, необходимо отправить на сервер заголовок, содержащий правильный Content-Type. Для форм, заголовок Content-Type должен выглядеть следующим образом:

Content-Type: application/x-www-form-urlencoded 

Во многих случаях, сервер может неправильно отреагировать, если в запросе не указан Content-Type. Например, компонент Active Server Pages вебсервера IIS 3.0 проверяет заголовок на наличие в нём 'application/x-www-form- urlencoded' перед тем, как добавить переменные формы в объект "Request.Form". Данный MIME/Content-Type указывает на то, что передаваемые данные это список URL-кодированных переменных формы. Под URL-кодированием понимается, что символы пробела (ASCII 32) будут закодированы как '+', а специальный символ, например, такой как '!' будет закодирован шестнадцатиричной форме как '%21'.

Вот кусок кода, использующего классы MFC WinInet для эмуляции запроса формы POST:

   CString strHeaders =
      _T("Content-Type: application/x-www-form-urlencoded");
   // URL-кодированные переменные формы -
   // name = "John Doe", userid = "hithere", other = "P&Q"
   CString strFormData = _T("name=John+Doe&userid=hithere&other=P%26Q");

   CInternetSession session;
   CHttpConnection* pConnection =
      session.GetHttpConnection(_T("ServerNameHere"));
   CHttpFile* pFile =
      pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,
                              _T("FormActionHere"));
   BOOL result = pFile->SendRequest(strHeaders,
      (LPVOID)(LPCTSTR)strFormData, strFormData.GetLength()); 

Без MFC тот же код будет выглядет следующим образом:

   static TCHAR hdrs[] =
      _T("Content-Type: application/x-www-form-urlencoded");
   static TCHAR frmdata[] =
      _T("name=John+Doe&userid=hithere&other=P%26Q");
   statuc TCHAR accept[] =
      _T("Accept: */*");

   // для понятности, проверка ошибок была удалена
   HINTERNET hSession = InternetOpen("MyAgent",
      INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
   HINTERNET hConnect = InternetConnect(hSession, _T("ServerNameHere"),
      INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
   HINTERNET hRequest = HttpOpenRequest(hConnect, "POST",
      _T("FormActionHere"), NULL, NULL, accept, 0, 1);
   HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));
   // закрываем internet-дескрипторы

 


За более подробной информацией URL-кодированию и формату запроса POST обращайтесь к секции 8.2 в RFC 1866.