Top / Programming / C++Builder / IndyのTIdHTTPコンポーネントでWebサーバーにアクセスする

IndyのTIdHTTPコンポーネントでWebサーバーにアクセスする

IndyのTIdHTTPコンポーネントでWebサーバーにアクセスする方法を紹介します。

TIdHttpコンポーネントの配置

Webサーバーにアクセスするには、TIdHTTPを使います。

フォームにTIdHttpコンポーネントを配置します。

TIdHttpコンポーネント

Getメソッドでアクセスする

TMemoryStream* ms = new TMemoryStream(); //取得したデータを格納する
IdHTTP1->Get("http://www.google.co.jp/", ms);

//取得したデータをTMemoに表示
ms->Position = 0;
Memo1->Lines->LoadFromStream(ms.get(), TEncoding::UTF8); //文字コードUTF-8

取得したデータはバイト列です。
文字列に変換する時は、文字コードにあわせて、適切に変換する必要があります。

//文字コードがUTF-8の場合
UTF8String s = reinterpret_cast<char*>(ms->Memory);

//文字コードがShift_JISの場合
AnsiStringT<932> s = reinterpret_cast<char*>(ms->Memory);

//文字コードがEUC_JPの場合
AnsiStringT<20932> s = reinterpret_cast<char*>(ms->Memory);

IndyのReadStringFromStream関数を使って変換することもできます。

//文字コードがUTF-8の場合
UnicodeString s = ReadStringFromStream(ms.get(), ms->Size, TEncoding::UTF8);

文字コードがわからない場合は、判別する必要があります。
文字コードを判別する方法については「文字コードを判別する」をご覧ください。

サーバーにアクセスした結果をファイルに保存する

TFileStream* fs = new TFileStream("C:\\test.txt", fmCreate | fmOpenWrite);
IdHTTP1->Get("http://www.google.co.jp/", fs);

Postメソッドでアクセスする

//パラメータ
TStringList* params = new TStringList();
params->Values["q"] = "value";

TMemoryStream* ms = new TMemoryStream();
IdHTTP1->Post("http://localhost/test.cgi", params, ms);

httpsにアクセスする

TIdSSLIOHandlerSocketOpenSSLコンポーネントを配置し、TIdHttpコンポーネントのIOHanderプロパティに設定します。

TIdSSLIOHandlerSocketOpenSSLコンポーネント

SSL DLLを「http://indy.fulgan.com/SSL/」からダウンロードし、libeay32.dllとssleay32.dllを実行プログラムと同じフォルダーに配置します。

後は、普通にアクセスします。

TMemoryStream* ms = new TMemoryStream();
IdHTTP1->Get("https://〜", ms);

Cookieを送信する

//パラメータ
TStringList* params = new TStringList();
params->Values["q"] = "テスト";

//Cookieを設定する
IdHTTP1->Request->CustomHeaders->Add("Cookie:MyName=MyValue");

TMemoryStream* ms = new TMemoryStream();
IdHTTP1->Post("http://localhost/index.php", params, ms);

Cookieを受信する

サーバーから送られてきたCookieを受信するにはTIdCookieManagerコンポーネントを使用します。

フォームにTIdCookieManagerを配置します。

TIdCookieManagerコンポーネント

TIdHttpコンポーネントのCookieManagerにTIdCookieManagerを設定します。

//サーバーにリクエストを送信
TMemoryStream* ms = new TMemoryStream();
IdHTTP1->Post("http://localhost/index.php", ms);

//Cookieを一つずつ処理
for (int i = 0; i < IdCookieManager1->CookieCollection->Count; ++i)
{
  TIdNetscapeCookie* cookie = IdCookieManager1->CookieCollection->Items[i];
  UnicodeString name = cookie->CookieName;
  UnicodeString text = cookie->CookieText;
  UnicodeString domain = cookie->Domain;
  TDateTime expires = cookie->Expires;
  UnicodeString path = cookie->Path;
  //Cookieを処理する
}

ファイルをアップロードする

ファイルをアップロードするにはTIdMultiPartFormDataStreamを使用します。

TIdMultiPartFormDataStream* source = new TIdMultiPartFormDataStream();
source->AddFile("file", "C:\test\sample.jpg", "image/jpeg");

AddFileメソッド引数は次のようになります。

  1. フィールド名(<input type="file" name="フィールド名" >)
  2. アップロードするファイルの場所
  3. アップロードするファイルのContent-Type

ファイルをアップロードするプログラムは次のようになります。

TIdMultiPartFormDataStream* source = new TIdMultiPartFormDataStream();
source->AddFile("file", "C:\test\sample.jpg", "image/jpeg");
TMemoryStream* response = new TMemoryStream();
IdHTTP1->Post("http://localhost/test/upload.php", source, response);

関連

更新履歴