WebサーバーにGET,POSTしてコンテンツを取得 ~Delphiソースコード集
TNetHTTPClientを使うとGET・Postでパラメータを与えることも、カスタムヘッダーやCookieを扱うこともできます。
フォーム画面の作成
Delphi IDEを起動し、「ファイル」⇒「Windows VCLアプリケーション -Delphi」をクリックしますフォームにTButtonを2つ、TNetHTTPClientを1つ、TMemoを1つをドラッグ&ドロップします。
プログラムの作成
以下ソースコードを記述します。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Net.URLClient,
System.Net.HttpClient, System.Net.HttpClientComponent;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
NetHTTPClient1: TNetHTTPClient;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure NetHTTPClient1AuthEvent(const Sender: TObject;
AnAuthTarget: TAuthTargetType; const ARealm, AURL: string; var AUserName,
APassword: string; var AbortAuth: Boolean;
var Persistence: TAuthPersistenceType);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
//クラスヘルパーでクッキーを消せるようにする
TCookieManagerHelper = class helper for TCookieManager
procedure DeleteCookie(i:Integer);
procedure DeleteAllCookies();
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses System.NetEncoding;
{TCookieManagerHelper}
procedure TCookieManagerHelper.DeleteCookie(i:Integer);
begin //i番目のクッキーを消す
with self do
FCookies.Delete(i);
end;
procedure TCookieManagerHelper.DeleteAllCookies();
begin //全てのクッキーを消す
with self do
FCookies.Clear;
end;
{TForm1}
procedure TForm1.Button1Click(Sender: TObject);
var strm:TMemoryStream; //サーバーからの応答コンテンツの格納用ストリーム
res:IHTTPResponse; //サーバーからの応答
Header:TNetHeaders; //カスタムヘッダー生成用
i:Integer;
Cookie:TCookie; //クッキー生成用
AUrl:TURI;
b:TBytes;
GerParam:string; //GETパラメータ生成用
begin
strm:=TMemoryStream.Create;
try
//ユーザーエージェントを適当に設定
NetHTTPClient1.UserAgent:=
'Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) '+
'AppleWebKit/605.1.15 (KHTML, like Gecko) '+
'Version/12.0 Mobile/15E148 Safari/604.1';
//クッキーを受け取れるようにする
NetHTTPClient1.AllowCookies:=True;
//クッキーを設定する
NetHTTPClient1.CookieManager.AddServerCookie(
'cookie1=cookieValue1',
'http://localhost'
);
//クッキーを設定する
NetHTTPClient1.CookieManager.AddServerCookie(
'cookie2=cookieValue2',
'http://localhost'
);
//クッキーを設定する
Cookie.Name:='cookie3';
b:=TEncoding.UTF8.GetBytes('UTF8の日本語をクッキーに入れてみる');
Cookie.Value:=System.NetEncoding.TURLEncoding.URL.EncodeBytesToString(b);
Cookie.Expires:=EncodeDate(2025,1,1);//有効期限
Cookie.Domain:='.localhost'; //ドメイン
Cookie.Path:='/';
Cookie.Secure:=False; //セキュアフラグ
Cookie.HttpOnly:=True; //HTTPOnlyフラグ
AUrl.Create('http://localhost');
NetHTTPClient1.CookieManager.AddServerCookie(Cookie,AUrl);
//カスタムヘッダーを設定する
// 基本(ベーシック)認証のヘッダーを生成する
SetLength(Header,1);
Header[0].Create(
'Authorization',
'Basic '+TNetEncoding.Base64.Encode('user:password')
);
//GETパラメータを設定する
b:=TEncoding.UTF8.GetBytes('UTF8の日本語をGETで生成する');
GerParam:='getname='+
System.NetEncoding.TURLEncoding.URL.EncodeBytesToString(b);
//WebサーバーにGET接続する
res:=NetHTTPClient1.Get(
'http://localhost/tnethttpclient_test.php?'+GerParam,
strm,Header
);
//届いたコンテンツをUTF8文字として出力する
memo1.Lines.LoadFromStream(strm,TENcoding.UTF8);
memo1.Lines.Insert(0,'■届いたコンテンツ');
memo1.Lines.Add('--------------------------------');
//charsetを出力する(届かないサーバーもある)
memo1.Lines.Insert(0,'■届いたコンテンツの文字コード');
memo1.Lines.Insert(1,res.ContentCharSet);
memo1.Lines.Insert(2,'--------------------------------');
//サーバー側で設定(追加、変更)されたクッキーを出力する
memo1.Lines.Add('■サーバー側で設定(追加、変更)されたクッキー');
for i := 0 to res.Cookies.Count-1 do
begin
memo1.Lines.Add(
res.Cookies[i].Name+' : '+
System.NetEncoding.TURLEncoding.URL.Decode(res.Cookies[i].Value)
);
end;
memo1.Lines.Add('--------------------------------');
//現在の全てのクッキーを出力する
memo1.Lines.Add('■現在のクッキー');
for i := 0 to Length(NetHTTPClient1.CookieManager.Cookies)-1 do
begin
memo1.Lines.Add(
'('+
NetHTTPClient1.CookieManager.Cookies[i].Domain+
NetHTTPClient1.CookieManager.Cookies[i].Path+
') '+
NetHTTPClient1.CookieManager.Cookies[i].Name+': '+
System.NetEncoding.TURLEncoding.URL.Decode(
NetHTTPClient1.CookieManager.Cookies[i].Value
)
);
end;
memo1.Lines.Add('--------------------------------');
//届いたヘッダーを出力する
memo1.Lines.Add('■届いたヘッダー');
for i := 0 to length(res.Headers)-1 do
begin
memo1.Lines.Add(
res.Headers[i].Name+':'+res.Headers[i].Value
);
end;
finally
strm.Free;
end;
//0個目のクッキーを消す
//NetHTTPClient1.CookieManager.DeleteCookie(0);
//全てのクッキーを消す
NetHTTPClient1.CookieManager.DeleteAllCookies;
end;
procedure TForm1.Button2Click(Sender: TObject);
var stl:TStringList; //Postの値を入れる
strm:TMemoryStream; //サーバーからの応答コンテンツが入る
res:IHTTPResponse; //サーバーからの応答
i:Integer;
begin
//POSTする場合
Memo1.Clear;
stl:=TStringList.Create;
strm:=TMemoryStream.Create;
try
stl.Add('postname1=値1');
stl.Add('postname2=値2');
//WebサーバーにPOST接続する
res:=NetHTTPClient1.Post(
'http://localhost/tnethttpclient_test.php',
stl, //Postする値
strm, //レスポンスストリーム
TEncoding.UTF8, //Postする文字列の文字コード
[] //カスタムヘッダ
);
//届いたコンテンツをUTF8文字として出力する
memo1.Lines.LoadFromStream(strm,TENcoding.UTF8);
memo1.Lines.Insert(0,'■届いたコンテンツ');
memo1.Lines.Add('--------------------------------');
//charsetを出力する
memo1.Lines.Insert(0,'■届いたコンテンツの文字コード');
memo1.Lines.Insert(1,' '+res.ContentCharSet);
memo1.Lines.Insert(2,'--------------------------------');
//現在の全てのクッキーを出力する
memo1.Lines.Add('■現在のクッキー');
for i := 0 to Length(NetHTTPClient1.CookieManager.Cookies)-1 do
begin
memo1.Lines.Add(
'('+
NetHTTPClient1.CookieManager.Cookies[i].Domain+
NetHTTPClient1.CookieManager.Cookies[i].Path+
') '+
NetHTTPClient1.CookieManager.Cookies[i].Name+': '+
System.NetEncoding.TURLEncoding.URL.Decode(
NetHTTPClient1.CookieManager.Cookies[i].Value
)
);
end;
memo1.Lines.Add('--------------------------------');
//届いたヘッダーを出力する
memo1.Lines.Add('■届いたヘッダー');
for i := 0 to length(res.Headers)-1 do
begin
memo1.Lines.Add(
res.Headers[i].Name+':'+res.Headers[i].Value
);
end;
finally
stl.Free;
strm.Free;
end;
//0個目のクッキーを消す
//NetHTTPClient1.CookieManager.DeleteCookie(0);
//全てのクッキーを消す
NetHTTPClient1.CookieManager.DeleteAllCookies;
end;
procedure TForm1.NetHTTPClient1AuthEvent(const Sender: TObject;
AnAuthTarget: TAuthTargetType; const ARealm, AURL: string; var AUserName,
APassword: string; var AbortAuth: Boolean;
var Persistence: TAuthPersistenceType);
begin
//基本認証はこのイベント(TNetHTTPClient.OnAuthEvent)でも認証可能
if AnAuthTarget = TAuthTargetType.Server then
begin
AUserName:='user';
APassword:='password';
end;
end;
end.
(参考)WEBサーバー側(localhost)のPHPソースコード
<?php //文字コードUTF-8で保存すること
//届いたクッキーの内容を出力する
if(count($_COOKIE)>0){
echo "クッキーを受け取りました\r\n";
foreach($_COOKIE as $key=>$val){
echo ' '.$key.'='.$val."\r\n";
//file_put_contents(__DIR__.'/tnethttpclient.txt',$val."\r\n",FILE_APPEND);
}
}
//届いたGET又はPOSTの内容を出力する
if(count($_REQUEST)>0){
echo "GET又はPOSTでパラメータを受け取りました\r\n";
foreach($_REQUEST as $key=>$val){
echo ' '.$key.'='.$val."\r\n";
//file_put_contents(__DIR__.'/tnethttpclient.txt',$val."\r\n",FILE_APPEND);
}
}
//届いた基本認証ヘッダーを出力
if(isset(getallheaders()['Authorization'])){
echo "基本認証ヘッダーを受け取りました\r\n";
echo " Authorization: ".getallheaders()['Authorization']."\r\n";
}
//WEBサーバー側でクッキーを設定
setCookie('cookie3','Set Cookie3 Value from WebServer');
setCookie('cookie4','Set Cookie4 Value from WebServer');
実行してみる
実行して、Button1をクリックするとGETメソッドでサーバーに接続して応答などが表示されます。
(参考)GETで送信時のヘッダーと受信時のヘッダー
GETメソッドでサーバーに送信するHTTPヘッダー以下の赤字の個所でクッキーを送信している
Connection: Keep-Alive
Authorization: Basic dXNlcjpwYXNzd29yZA==
Cookie: cookie3=UTF8%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%92%E3%82%AF%E3%83%83%E3%82%AD%E3%83%BC%E3%81%AB%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%82%8B; cookie2=cookieValue2; cookie1=cookieValue1
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone ・・・省略
Host: 192.168.1.2
GETメソッドでサーバーから受信するHTTPヘッダー以下の赤字の個所でクッキーを受信している
Date: Tue, 08 Mar 2022 10:33:16 GMT
Server: Apache/2.4.27 (Win64) OpenSSL/1.1.0f PHP/7.2.7
X-Powered-By: PHP/7.2.7
Set-Cookie: cookie3=Set+Cookie3+Value+from+WebServer
Set-Cookie: cookie4=Set+Cookie4+Value+from+WebServer
Content-Length: 287
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
