プログラムからインターネットの掲示板に書き込むアプリケーションを
作っています。
InternetOpenUrlを使って掲示板を読むことは出来るのですが
肝心の書き込みが出来ません。
POSTメソッドでパラメータIDとPASSWORDを渡そうとしているのですが
HttpSendRequestでタイムアウトが発生しているようです。
返値としてFalseが返りecodeに12007が代入されます。
サンプルソースを示します。
引数は
url1にhttp://掲示板のサーバー
url2に掲示板の相対アドレス
url3にcgi名
を入れているのですが自分でもよくわかっていません。
サーバーにPOSTする方法がありましたら教えてください。
お願いします。
function PostHtmlSource(const url1: string;const url2 : string;const url3: string): boolean;
const
UserAgent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)';
HeadStr = 'Content-Type: application/x-www-form-urlencoded';
var
hSession: HINTERNET;
hConnect : HINTERNET;
hRequest: HINTERNET;
hService: HINTERNET;
dwBytesRead: Cardinal;
s : string;
ecode : Integer;
dummy,BufLen : Cardinal;
begin
Result:=False;
s := 'ID=TAKE&PASSWORD=9876'//POSTするパラメータ;
hSession := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
if Assigned(hSession) then
begin
hConnect := InternetConnect(hSession, Pchar(Url1), INTERNET_DEFAULT_HTTP_PORT,
nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
hRequest := HttpOpenRequest(hConnect, 'POST',PChar(Url2),nil,PChar(Url3), nil,
INTERNET_FLAG_RESYNCHRONIZE, 1);
result := HttpSendRequest(hRequest, PChar(HeadStr),Length(HeadStr),Pchar(s),Length(s));
ecode := GetLastError();
end;
finally
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
end;
end;
自己レスです。
TNMHTTPクラスを使って
さらに引数をファイルとして書き出しておけば
なんとか出来そうです。
FNMHTTP.Post(url,'temp.txt')
WinInetはバグがあると聞きました。
TNMHTTPクラスを使った方が無難なのでしょうか
意見を聞いてから解決としたいと思います。
NetManageのコンポーネントは、Delphi5まででしたっけ?
もし、Delphi5を使い続けるのなら、もしくは、NetManageのコンポーネントを別途購入するのであれば、よろしいかと思います。
Delphi7以降にするかもしれないのであれば、indyも良いかと思います。
Indy9のバージョンが、9.0.17になっていました。
また、Indy10も、10.0.18-Bおよび、10.0.19-Bが出ていました。
http://www.indyproject.org/
まだ使用していませんが、Indyにもバグはあります。D7付属のIndyでは、日本語メールを正しく扱えない場合があります。
今回のバージョンで直ったかな?
# 未確認
Indyをインストールしてみたのですが
パスが通ってないのか何故かコンパイルエラーが出ます。
ソフト自身はとりあえずPOSTはTNMHTTPを使う方法で完成しました。
あとは送受信中他の処理が止まるからスレッド化したいと思います。
ツイート | ![]() |