HttpSendRequestで、POST送信のエラーを解消したい

解決


ぷーさん  2012-10-01 09:00:10  No: 43078

いつもお世話になっております。

Wininet を使って、POST送信しようと下記のコーディングをしましたが、HttpSendRequestで、エラーを起こしてしまします。どなたか問題点をご指摘・ご指導いただけませんでしょうか。
Delphi4 WinXPと聊かふ古い環境です。よろしくお願い致します。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, WinInet,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  hNet,hURL,hRequest: HINTERNET;

  Buffer :array [0..1023] of Char;
  ReadCount :Cardinal;
  HtmlStr :string;

  TimeOut: integer;

begin
  hNet :=InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0);

  if Assigned(hNet) then
  begin
  try
    hURL := InternetConnect(hNet,PChar('http://www.xxxxx.com'),INTERNET_DEFAULT_HTTP_PORT,nil,nil,INTERNET_SERVICE_HTTP,0,DWORD(0));
    //http://www.xxxxx.comは、適宜変更

    if(hURL<>nil) then
      begin
           Memo1.Lines.Add('Connect_OK');
           hRequest := HttpOpenRequest(hURL, PChar('POST'), PChar('/xxxxx/index.html'),'HTTP/1.0',PChar(''), nil, INTERNET_FLAG_RELOAD,0);
      ///xxxxx/index.htmlは、適宜変更
      end;

    if(hRequest<>nil) then
      begin
           Memo1.Lines.Add('Open_Request_OK');

           TimeOut := 60 * 1000;

           if(InternetSetOption(hNet, INTERNET_OPTION_RECEIVE_TIMEOUT, @TimeOut,SizeOf(TimeOut))) then
             Memo1.Lines.Add('Set_TimeOut_OK')
           else
             Memo1.Lines.Add('Set_TimeOut_Error');

           if(HttpSendRequest(hRequest,nil , 0, PChar('?para1=TEST'), strlen(PChar('?para1=TEST')))) then
               Memo1.Lines.Add('Send_OK')
           else
               Memo1.Lines.Add('Send_Error');  //ここで、エラーになってしまう。
      end;

    while true do begin

       InternetReadFile(hRequest, @Buffer, Sizeof(Buffer), ReadCount); //URLハンドルを元にBufferに読み込む(ファイル最後まで繰り返す)

       if ReadCount = 0 then Break;  //ファイルの最後までいったら抜ける
       HtmlStr :=HtmlStr +string(Buffer);

      end;

     Memo1.Lines.Add(HtmlStr);

    InternetCloseHandle(hNet);
  except
      ShowMessage('error');
    end
  end;
end;

end.


KHE00221  2012-10-02 03:55:00  No: 43079

http://www.xxxxx.com

www.yahoo.co.jp

/xxxxx/index.html

index.html

で Send_OK にはなる


ぷーさん  2012-10-02 08:30:31  No: 43080

KHE00221さん
ご指導ありがとうございます。
単純なパラメータ設定誤りでした。
今後ともよろしくお願い致します。


ぷーさん  2012-10-03 06:39:52  No: 43081

申し訳ありません。

HttpsendRequestのエラーは解消し、データをリードできるようにはなりました。
しかし、POSTするデータの記述の仕方が悪いのか、POSTされないようです。

HttpSendRequest(hRequest,nil , 0, PChar('?para1=TEST'), strlen(PChar('?para1=TEST')))

書き方について、どなたかご指導頂けませんでしょうか。
よろしくお願い致します。


お約束  2012-10-03 07:01:01  No: 43082

POSTするには、ヘッダをつけて送信しなきゃ。
これお約束ね。パラメータの最初の'?'も不要。
const
  HeadStr = 'Content-Type: application/x-www-form-urlencoded';

HttpSendRequest(hRequest, PChar(HeadStr), Length(HeadStr), …


ぷーさん  2012-10-03 08:43:52  No: 43083

お約束さん

早速のご指導ありがとうございました。

無事送信できました。

今後ともよろしくお願い致します。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加