[delphi-users:2881] XE2 のIntrawebで URL取得方法は?

308 views
Skip to first unread message

snail3

unread,
Nov 26, 2012, 12:40:43 PM11/26/12
to delphi...@freeml.com
いつもお世話になっています。。

最近 Intraweb の勉強をしています。
表題の通りなんですが、URLで指定された問合せQUERYを取り出したいと
考えています。「問合せQUERY」という言葉も正しくないかもしれませんが
google map などで 「?」 の後に指定する文字列、
例:https://maps.google.co.jp/maps?hl=ja&tab=wl
この例では「hl=ja&tab=wl」の部分を取り出したいのですが、方法がまるで
わかりません。なんでも結構ですから教えてください。

よろしくお願いします。
--
takashi <taka...@csjpn.com>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
大宇宙へいざ出撃!【ブラウザ銀河大戦】
http://ad.freeml.com/cgi-bin/sa.cgi?id=jkHys
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
Nov 26, 2012, 8:42:22 PM11/26/12
to delphi...@freeml.com
takashi さん

こんにちは
細川です。

こんなコードでいかがでしょう?

----------------------------------------------------------------------------
uses
System.SysUtils, System.Classes, IdURI;

// TIdURI を使ってパラメータを取り出す
procedure GetParams(const iURL: String; const iStrings: TStrings);
var
URI: TIdURI;
Params: TArray<String>;
Param: String;
begin
URI := TIdURI.Create(iURL);
try
Params := URI.Params.Split(['&']);

iStrings.Clear;
for Param in Params do
iStrings.Add(TIdURI.URLDecode(Param));
finally
URI.Free;
end;
end;


// 呼び出す例
procedure CallGetParams;
var
SL: TStringList;
Str: String;
begin
SL := TStringList.Create;
try
GetParams('https://maps.google.co.jp/maps?hl=ja&tab=wl', SL);

for Str in SL do
Writeln(Str);
finally
SL.Free;
end;
end;

----------------------------------------------------------------------------



■Delphi Advent Calendar 2012 参加者募集中!
http://atnd.org/events/34390
Regards,
HOSOKAWA Jun
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970
twitter: http://twitter.com/serialgames
twitter: http://twitter.com/flaver_sg
mailto: j...@serialgames.co.jp
fla:ver http://flaver.jp/
WebCapS http://www.serialgames.co.jp/fun.html#WebCapSeria


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
今すぐ遊べる!本格ブロック崩し
http://ad.freeml.com/cgi-bin/sa.cgi?id=jkKDY
------------------------------------------------------[freeml byGMO]--

snail3

unread,
Nov 26, 2012, 9:17:40 PM11/26/12
to delphi...@freeml.com
ありがとうございます。
でもやりたい事と違っています。説明不足で申し訳ありません。

IntraWeb サーバーに接続して来たクライアントが指定した
パラメータを取り出したいのです。

ミガロさんのHPにあるアクロバットの資料がわかりやすいのですが
http://www.migaro.co.jp/contents/maintenance/common/techseminar/02/MigaroTech02_01.pdf
↑こ資料の29ページからの説明してある GETメソッドを利用
したパラメータを取り出す方法を探しています。

開発元のHPを見ても資料が少ないようで
英語もからないので困っています。

--
takashi <taka...@csjpn.com>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
アイテム満載のクレーンゲーム【クレーン夫人】
http://ad.freeml.com/cgi-bin/sa.cgi?id=jkLjy
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
Nov 26, 2012, 10:33:41 PM11/26/12
to delphi...@freeml.com
takashi さん

なるほど。
Perl で言うところの

$ENV{'QUERY_STRING'}

みたいに GET パラメータを取得したい、ということですね?

IntraWeb のサーバアプリケーションで、それを取得する方法は判りません。
そもそも IntraWeb を使ったことがないので……。

IntraWeb のサーバアプリケーションは、HTTP サーバも IntraWeb が実装しているので
しょうか?
もしそうれであれば、サーバの変数から取得できそうな気がします。
(SERVER.QUERY_STRING という定数があるっぽいです)

ISAPI の Filter や ISAPI 拡張 なら

---------------------------------------------------------------------------
// IIS の Filter DLL からサーバ情報を取得する例
function TServerManager.GetServerValue(
var ioFilterContext: THTTP_FILTER_CONTEXT;
const iName: String): String;
var
Data: array[0.. 1023] of AnsiChar;
Size: DWORD;
begin
Result := '';

Size := SizeOf(Data);

if
(
ioFilterContext.GetServerVariable(
ioFilterContext,
PAnsiChar(AnsiString(iName)),
@Data,
Size)
)
then begin
Data[Size] := #0;
Result := String(AnsiString(Data));
end;
end;
--------------------------------------------------------------------------

こんなメソッドを定義して

GetServerValue(Context, 'QUERY_STRING');

こんな風にすると取れます。
Regards,
HOSOKAWA Jun
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970
twitter: http://twitter.com/serialgames
twitter: http://twitter.com/flaver_sg
mailto: j...@serialgames.co.jp
fla:ver http://flaver.jp/
WebCapS http://www.serialgames.co.jp/fun.html#WebCapSeria


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
最強の基地を築け!【ロボ・ウォーズ】
http://ad.freeml.com/cgi-bin/sa.cgi?id=jkMvm
------------------------------------------------------[freeml byGMO]--

snail3

unread,
Nov 27, 2012, 12:31:17 AM11/27/12
to delphi...@freeml.com
細川さんありがとうございます。

昨日、その名もずばり「GetUrl」という関数を wiki で見つけましたが
http://www.atozed.com:8891/index.html

使い方がわかりません。実行すると例外が発生します。

そもそも基礎がわかっていないのもあって、インターネットで
見つける情報も理解できません。
新旧色々なバージョンでの例やISAPI やJavaでの話、
色々な情報が引っかかって、藪の中で迷子になっています。


takashi <taka...@csjpn.com>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
☆あなたはファッション大好きおしゃれ泥棒☆
http://ad.freeml.com/cgi-bin/sa.cgi?id=jkPhP
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
Nov 27, 2012, 2:14:00 AM11/27/12
to delphi...@freeml.com
takashi さん

細川です。

軽く IntraWeb のサーバアプリケーションを作ってみました。
すると、THttpRequest というクラスに情報がまとまっているようですね。
どのような、シチュエーションでパラメータを取得しようとしているのか判りませんが、
WebApplication.Request もしくは TIWForm.OnURLRequest の引数、などで
THttpRequest のインスタンスが取得できるようです。
多分、THttpRequest.Query プロパティがご所望の物だと思います。
Regards,
HOSOKAWA Jun
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970
twitter: http://twitter.com/serialgames
twitter: http://twitter.com/flaver_sg
mailto: j...@serialgames.co.jp
fla:ver http://flaver.jp/
WebCapS http://www.serialgames.co.jp/fun.html#WebCapSeria


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
学園生活でのときめく出会い☆
http://ad.freeml.com/cgi-bin/sa.cgi?id=jkQFM
------------------------------------------------------[freeml byGMO]--

snail3

unread,
Nov 27, 2012, 2:42:23 AM11/27/12
to delphi...@freeml.com
細川さんありがとうございます。

> すると、THttpRequest というクラスに情報がまとまっているようですね。
THttpRequestをHELPしても何も表示されないのに、なぜわかるのですか

> 軽く IntraWeb のサーバアプリケーションを作ってみました。
> すると、THttpRequest というクラスに情報がまとまっているようですね。

昨日は1日、2時までやってできませんでした。
仕事が早くてうらやましいです。

> どのような、シチュエーションでパラメータを取得しようとしているのか判りませんが、

フォームのボタンクリックで取り出せないかと思って
↓のようなテストプログラムを組んでみました

procedure TIWFormTest04.IWButton4Click(Sender: TObject);
begin
IWMemo1.Clear;
IWMemo1.Lines.Add( 'Request.Query:'+ WebApplication.Request.Query );
end;

ブラウザを起動して「http://127.0.0.1:8888/$a=bbb」といった感じで
フォームを表示させてからボタンをクリックしてみても何も入っていません。

もう少し詳しく教えていただけないでしょうか。
お手数をおかけしますがよろしくお願いします。

--
takashi <taka...@csjpn.com>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
かわいいベジモンがたくさん!自分だけの農場を作ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=jkRjK
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
Nov 27, 2012, 3:51:23 AM11/27/12
to delphi...@freeml.com
takashi さん

細川です。

僕も全然詳しくない、というか、さっき触ったばかりなのですが……

> > すると、THttpRequest というクラスに情報がまとまっているようですね。
> THttpRequestをHELPしても何も表示されないのに、なぜわかるのですか

大体、この辺りが怪しいな、というプロパティなどでコード補完させると、メソッドや
プロパティの一覧が出るので、そこから探った結果です。

最初は、IIS の Filter/Extend と同じであれば、アプリケーション全体のオブジェク
トに何か存在するはずだ、とアタリを付けてアプリケーションオブジェクトを探しまし
た。
Self. と押してコード補完をすると、Self.WebApplication を見つけました。
そこから、Self.WebApplication. と押してコード補完をすると Request というオブジェ
クトが見つかり、THttpRequest という型だと判ったので、ググったまでです。

> フォームのボタンクリックで取り出せないかと思って
> ↓のようなテストプログラムを組んでみました
>
> procedure TIWFormTest04.IWButton4Click(Sender: TObject);
> begin
> IWMemo1.Clear;
> IWMemo1.Lines.Add( 'Request.Query:'+ WebApplication.Request.Query );
> end;
>
> ブラウザを起動して「http://127.0.0.1:8888/$a=bbb」といった感じで
> フォームを表示させてからボタンをクリックしてみても何も入っていません。

推測ですが IWButton4Click で戻ってくる URL はあくまで "http://127.0.0.1:8888/$"
です。
パラメータが付いた URL に戻ってくるわけでは無いので、Query は付いていません。

たとえば、

procedure TIWFormTest04.IWAppFormRender(Sender: TObject);
begin
IWMemo1.Clear;
IWMemo1.Lines.Add( 'Request.Query:'+ WebApplication.Request.Query );
end;

procedure TIWFormTest04.IWButton1Click(Sender: TObject);
begin
WebApplication.GoToURL(WebApplication.Request.Referer + '?test=1');
end;

こんな風にすると QUERY_STRING が取れるんじゃ無いかと思います。
Regards,
HOSOKAWA Jun
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970
twitter: http://twitter.com/serialgames
twitter: http://twitter.com/flaver_sg
mailto: j...@serialgames.co.jp
fla:ver http://flaver.jp/
WebCapS http://www.serialgames.co.jp/fun.html#WebCapSeria


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
志士達を率いて熱き時代を駆け抜けろ!【幕末魂】
http://ad.freeml.com/cgi-bin/sa.cgi?id=jkSuW
------------------------------------------------------[freeml byGMO]--

snail3

unread,
Nov 27, 2012, 4:44:11 AM11/27/12
to delphi...@freeml.com
細川さん、ありがとうございました。

> procedure TIWFormTest04.IWAppFormRender(Sender: TObject);
これで、バッチリ取得できました。OnRender に気にもしていませんでした。

> Self. と押してコード補完をすると、Self.WebApplication を見つけました。
Self. で補完できるのも初めて知りました。(どれだけレベルが低いのやら)

> 推測ですが IWButton4Click で戻ってくる URL はあくまで "http://127.0.0.1:8888/$"
> です。
実際は Null でした。

> パラメータが付いた URL に戻ってくるわけでは無いので、Query は付いていません。
意味がよくわからないのですが、このあたりは何か良い参考書でもありますか。

ありがとうございました。

PS.
今回の件とは関係ありませんが、もしIntraWebのテストプログラム作成していて
「EOldSysError CoInitializeは呼び出されていません」のエラーが出るときは
IWServerControl の ComInitialize プロパティで ciMultiThreaded を指定しま
す。こいつもしばらく悩みました。


--
takashi <taka...@csjpn.com>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
たくさんの女の子モンスターを仲間にしよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=jkTqf
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
Nov 27, 2012, 6:59:52 AM11/27/12
to delphi...@freeml.com
takashi さん

細川です。

> > 推測ですが IWButton4Click で戻ってくる URL はあくまで "http://127.0.0.1:8888/$"
> > です。
> 実際は Null でした。
> > パラメータが付いた URL に戻ってくるわけでは無いので、Query は付いていません。
> 意味がよくわからないのですが、このあたりは何か良い参考書でもありますか。

値が取れないから null というわけではないです。
実際に IWButton4Click が押されると、HTTP 通信しますが、その呼び先は Query が付
いていない URL になっている、ということです。

参考書としては、普通に HTTP サーバの仕組みの本を読まれると良いと思います。
Regards,
HOSOKAWA Jun
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970
twitter: http://twitter.com/serialgames
twitter: http://twitter.com/flaver_sg
mailto: j...@serialgames.co.jp
fla:ver http://flaver.jp/
WebCapS http://www.serialgames.co.jp/fun.html#WebCapSeria


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
みんなで大陸開拓!【ドット・イーストの開拓民】
http://ad.freeml.com/cgi-bin/sa.cgi?id=jkVts
------------------------------------------------------[freeml byGMO]--

snail3

unread,
Nov 27, 2012, 9:50:34 AM11/27/12
to delphi...@freeml.com
細川さんこんばんは

> 値が取れないから null というわけではないです。
> 実際に IWButton4Click が押されると、HTTP 通信しますが、その呼び先は Query が付
> いていない URL になっている、ということです。

ここら辺の仕組みがちんぷんかんぷんです。

> 参考書としては、普通に HTTP サーバの仕組みの本を読まれると良いと思います。

一応、CGIやサーバー構築の本は読んでいます。そのときはわかったつもり
になっても本の内容と違うものに出くわすと、何がなんだか。

ありがとうございました。
--
takashi <taka...@csjpn.com>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
バトル参戦で目指せドラゴンマスター!
http://ad.freeml.com/cgi-bin/sa.cgi?id=jkYjy
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
Nov 27, 2012, 8:31:43 PM11/27/12
to delphi...@freeml.com
takashi さん

細川です。

> > 実際に IWButton4Click が押されると、HTTP 通信しますが、その呼び先は Query が付
> > いていない URL になっている、ということです。
> ここら辺の仕組みがちんぷんかんぷんです。

IntraWeb で表示されるページは普通に HTML になっているので、ソースを見てみてく
ださい。

IntraWeb のアプリを起動すると、最初に

http://127.0.0.1:xxxxx/$/

と、表示されていると思います。
ここを

http://127.0.0.1:xxxxx/$?test=1

としてもソースの FORM タグは下記のままで

<form method="POST" name="SubmitForm" action="/$">

action の値は変わっていません。
つまり、ボタンを押した時の通信先は

http://127.0.0.1:xxxxx/$/

となっている、ということです。
そのため、当然 Query は付いていません。
Regards,
HOSOKAWA Jun
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970
twitter: http://twitter.com/serialgames
twitter: http://twitter.com/flaver_sg
mailto: j...@serialgames.co.jp
fla:ver http://flaver.jp/
WebCapS http://www.serialgames.co.jp/fun.html#WebCapSeria


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
自分だけの三国志を創造せよ!
http://ad.freeml.com/cgi-bin/sa.cgi?id=jlcqV
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages