Як емулювати відправку даних форми на www-сервер за допомогою WinInet

WWW.ІСХОДНІКІ.РУ

Для емуляції відправки даних форми, необхідновідправити на сервер заголовок, що міститьправильний 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.

Функції WinInet описані тут.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*