HTTP-клиент
В этой статье рассказывается как создать обычное консольное приложение, которое будет выполнять роль HTTP-клиента. результат их работы выводится на экран. Можно, однако, перенаправить его в файл с расширением .html и посмотреть при помощи какого-нибудь браузера. Вот простой пример HTTP-клиента:
// HTTPClient.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "HTTPClient.h"
#include <afxinet.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{
CInternetSession ses;
CHttpConnection * con;
CHttpFile * file1=NULL;
INTERNET_PORT port=80;
const bufmax=10000;
char buf[bufmax];
int rec;
try
{
//соединение с Web-сервером
con=ses.GetHttpConnection("localhost/P-Lib",port);
//определяем запрос
file1=con->OpenRequest(1, "index.htm");
//послать запрос
file1->SendRequest();
do
{
//читаем порцию или всю
rec=file1->Read(buf,bufmax-1);
buf[rec]='\0';
printf("%s",buf);
}while(rec>0);
}
catch(CInternetException *pe)
{
printf("Error!\n");
return -1;
}
con->Close();
delete file1;
}
return nRetCode;
}
Центральными в данной программе являются классы, объекты которые задаются в следующих строках:
CInternetSession ses;
CHttpConnection * con;
CHttpFile * file1=NULL;
Класс CInternetSession, как обычно играет центральную роль. В строке:
con=ses.GetHttpConnection("localhost/P-Lib",port);
создаётся объект *con. Допустим если взять FTP-сервер, то эта строка не осуществляет реального соединения с HTTP-сервером. Реальное соединение осуществляется после успешного выполнения этих строк:
file1=con->OpenRequest(1, "index.htm");
file1->SendRequest();
В результате успешного выполнения этих строк создаётся объект *file1, который и используется в дальнейшем для получения информации с HTTP-сервера.
Представлю ещё один HTTP-клиент, который использует другие методы взаимодействия с сервером:
// HTTPClient2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "HTTPClient2.h"
#include <afxinet.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{
CInternetSession ses;
CStdioFile* file1=NULL;
const bufmax=10000;
char buf[bufmax];
int rec;
char iname[100];
//имя WEB-объекта
gets(iname);
try
{
//открываем URL
file1=ses.OpenURL(iname,0,
INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_KEEP_CONNECTION);
do
{
//чтение страници
rec=file1->Read(buf,bufmax-1);
buf[rec]='\0';
printf("%s",buf);
}while(rec>0);
}
catch(CInternetException *pe)
{
printf("Error!\n");
return -1;
}
delete file1;
}
return nRetCode;
}
В программе представлен более простой механизм взаимодействия с HTTP-сервером. Он основан на том, что метод OpenURL класса CInternetSession возвращает указатель на объект класса CStdioFile. Если запрос ресурса прошёл успешно, то образуется объект класса CStdioFile, с помощью метода Read которого можно читать ресурс.