【Delphi】idHTTP.Post

要以 Delphi 模擬在網頁 送出(或 提交, submit) 表單內容, 就要用到 IndyidHTTP(在 Indy Clients 分頁)

假設我們有個網頁表單, 表單有 2 個欄位, 1 個是 id, 1 個是 name.

Delphi 7 的做法: 放 1 個 idHTTP, 1 個 Button, 然後在 Button.OnClick Event 寫下 ----

var
    cPost: TStrings;
begin
    cPost := TStringList.Create;
    cPost.Add('id=123456789');
    cPost.Add('name=老灰鴨');
    idHTTP1.Post('http://網址/網頁.php',cPost);
    cPost.Free;
end;


就這麼簡單, 不過這只適用 postBIG5 網頁; 如果要將表單內容 postutf-8 網頁, 則上述做法就得略做調整了, 不然會發生類似下面的錯誤:

invalid byte sequence for encoding "UTF8":  0xbc
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server,  which is controlled by "client_encoding"

post 的網頁為 utf-8 時, 要使用 UTF8Encode 函式做字的編碼轉換.

假設我們使用了 TADOQuery, 名為 query, 所連結的資料表有 2 個欄位, 1 個是 id, 1 個是 name, 其中 name 欄位有些姓名為罕用字, 則在 TDataSet(包括底下繼承的 TADOTable, TADOQuery...) 的 Fields Editor 設定的欄位類別需設為 WideString, 而在取欄位值時要用 query.FieldByName('欄位名').AsVariant 做型別轉換, 或直接以 query['欄位名'] 的方式讓 Delphi 自動幫您判別並做型別轉換, 下面的例子就是用 query['欄位名'] 的方式.

var
    cPost: TStrings;
begin
    cPost := TStringList.Create;
    cPost.Add('id='+UTF8Encode(query['id']));
    cPost.Add('name='+UTF8Encode(query['name']));
    http.Post('http://網址/網頁.php', cPost);
    cPost.Free;
end;


至於 Delphi 2009 後的版本, 由於 Delphi 已全面支援 unicode, 所以直接以第一種方法 post 即可.