delphi - 如何使用 WinInet 在 Delphi 2010 中发送 HTTP Post 请求

标签 delphi http post wininet

<分区>

我想使用 WinInet 在 Delphi 2010 中发送 HTTP 发布请求,但我的脚本不起作用;/

这是我的 Delphi 脚本:

uses WinInet;
procedure TForm1.Button1Click(Sender: TObject);
var
  hNet,hURL,hRequest: HINTERNET;
begin
  hNet := InternetOpen(PChar('User Agent'),INTERNET_OPEN_TYPE_PRECONFIG or INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(hNet) then
  begin
  try
    hURL := InternetConnect(hNet,PChar('http://localhost/delphitest.php'),INTERNET_DEFAULT_HTTP_PORT,nil,nil,INTERNET_SERVICE_HTTP,0,DWORD(0));
    if(hURL<>nil) then
      hRequest := HttpOpenRequest(hURL, 'POST', PChar('test=test'),'HTTP/1.0',PChar(''), nil, INTERNET_FLAG_RELOAD or INTERNET_FLAG_PRAGMA_NOCACHE,0);
    if(hRequest<>nil) then
      HttpSendRequest(hRequest, nil, 0, nil, 0);
    InternetCloseHandle(hNet);
  except
      ShowMessage('error');
    end
  end;
end;

和我的 PHP 脚本:

$data = $_POST['test'];
$file = "test.txt";
$fp = fopen($file, "a");
flock($fp, 2);
fwrite($fp, $data);
flock($fp, 3);
fclose($fp);

最佳答案

主要问题:

  • InternetConnect 的第二个参数应该只包含服务器的名称,而不是服务器端脚本的整个 URL。

  • HttpOpenRequest的第三个参数应该是脚本的文件名(URL),而不是POST数据!

  • 实际的POST数据应该是HttpSendRequest的第四个参数。

小问题

  • INTERNET_OPEN_TYPE_PRECONFIG 或 INTERNET_OPEN_TYPE_PRECONFIG:INTERNET_OPEN_TYPE_PRECONFIG 就足够了。

  • DWORD(0) 太过分了。 0 就够了。

示例代码

我使用以下代码来发布数据:

procedure WebPostData(const UserAgent: string; const Server: string; const Resource: string; const Data: AnsiString); overload;
var
  hInet: HINTERNET;
  hHTTP: HINTERNET;
  hReq: HINTERNET;
const
  accept: packed array[0..1] of LPWSTR = (PChar('*/*'), nil);
  header: string = 'Content-Type: application/x-www-form-urlencoded';
begin
  hInet := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    hHTTP := InternetConnect(hInet, PChar(Server), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 1);
    try
      hReq := HttpOpenRequest(hHTTP, PChar('POST'), PChar(Resource), nil, nil, @accept, 0, 1);
      try
        if not HttpSendRequest(hReq, PChar(header), length(header), PChar(Data), length(Data)) then
          raise Exception.Create('HttpOpenRequest failed. ' + SysErrorMessage(GetLastError));
      finally
        InternetCloseHandle(hReq);
      end;
    finally
      InternetCloseHandle(hHTTP);
    end;
  finally
    InternetCloseHandle(hInet);
  end;
end;

例如:

WebPostData('My UserAgent', 'www.rejbrand.se', 'mydir/myscript.asp', 'value=5');

更新响应 OP 的回答

要从 Internet 读取数据,请使用 InternetReadFile 函数。我使用以下代码从 Internet 读取一个小的(单行)文本文件:

function WebGetData(const UserAgent: string; const Server: string; const Resource: string): string;
var
  hInet: HINTERNET;
  hURL: HINTERNET;
  Buffer: array[0..1023] of AnsiChar;
  i, BufferLen: cardinal;
begin
  result := '';
  hInet := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    hURL := InternetOpenUrl(hInet, PChar('http://' + Server + Resource), nil, 0, 0, 0);
    try
      repeat
        InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
        if BufferLen = SizeOf(Buffer) then
          result := result + AnsiString(Buffer)
        else if BufferLen > 0 then
          for i := 0 to BufferLen - 1 do
            result := result + Buffer[i];
      until BufferLen = 0;
    finally
      InternetCloseHandle(hURL);
    end;
  finally
    InternetCloseHandle(hInet);
  end;
end;

示例用法:

WebGetData('My UserAgent', 'www.rejbrand.se', '/MyDir/update/ver.txt')

因此,此函数仅读取数据,没有事先的 POST。但是,InternetReadFile 函数也可以与 HttpOpenRequest 创建的句柄一起使用,因此它也适用于您的情况。您确实知道 WinInet 引用是 MSDN,对吗?那里详细描述了所有 Windows API 函数,例如 InternetReadFile .

关于delphi - 如何使用 WinInet 在 Delphi 2010 中发送 HTTP Post 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2977720/

相关文章:

ios - 如何在 Delphi FireMonkey iOS 应用程序中存储和播放媒体文件?

delphi - FASM - 将字符串传递给 Delphi DLL

ios - Error Domain=NSURLErrorDomain Code=-1004 而不是 Swift 服务调用中的 -1009

php - 使用具有大量 INSERT 值的 PDO 的正确方法

c# - 如何从 byte[] 数组转换为 html?

delphi - 如何在Delphi中为TLabel创建淡入淡出效果

php - 如何为 AWS S3 图像添加 Http header

http - Snowplow Analytics `uid` GET 参数没有出现

php - 通过 AJAX 发送特殊字符( "&lt"、 "&gt"、 "&amp")

delphi - 德尔福中的经过/时间间隔?