标签: wininet

如何使用WinInet api在Delphi中发送HTTP POST请求

我正在尝试使用WinInet函数从Delphi发出HTTP请求.

到目前为止,我有:

function request:string;
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://example.com'),INTERNET_DEFAULT_HTTP_PORT,nil,nil,INTERNET_SERVICE_HTTP,0,DWORD(0));
    if(hURL<>nil) then
      hRequest := HttpOpenRequest(hURL, 'POST', PChar('param=value'),'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
    on E : Exception do
      ShowMessage(E.ClassName+' error raised, with message : '+E.Message);
  end;
  end
end;
Run Code Online (Sandbox Code Playgroud)

但这没有做任何事情(我正在嗅探网络http流量,看它是否有效).我已成功使用InternetOpenURL但我还需要发送POST请求,该功能不会这样做.

有人能告诉我一个简单的例子吗?我想要的结果是将var响应页面作为字符串获取.

delphi post http wininet request

15
推荐指数
1
解决办法
3万
查看次数

为什么FormatMessage()无法找到WinINet错误的消息?

我正在运行它来测试FormatMessage:

LPVOID lpMsgBuf;
errCode=12163;

FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM ,
    0,
    errCode,
    0,
    (LPTSTR) &lpMsgBuf,
    0, NULL );
Run Code Online (Sandbox Code Playgroud)

但是,当它返回lpMsgBuf包含NULL时......我期待像ERROR_INTERNET_DISCONNECTED这样的东西.

什么看错了?谢谢.

c windows winapi wininet formatmessage

15
推荐指数
1
解决办法
3025
查看次数

使用Delphi检测Internet连接激活

我一直在使用3G无线网卡,每次连接时,我的防病毒软件都会启动更新.

我想知道什么是Win32 API函数集,我可以用来获得通知或查询有关Internet连接即将发生的事件?

是否已经为Delphi提供了一组端口标头?

delphi winapi wininet internet-connection

11
推荐指数
2
解决办法
2万
查看次数

在下载之前使用WinInet识别总文件大小

我从第三方网站获得了以下来源,解释了如何使用互联网下载文件WinInet.我对API并不太熟悉,我看了一下该WinInet单元,但没有看到任何API调用,就像我需要的那样.

我正在做的是添加报告下载文件进度的功能.这个程序我已经包含在一个内部,TThread一切正常.但是,只缺少一个:在下载之前查找源文件的总大小.

请参阅下面我有评论的地方//HOW TO GET TOTAL SIZE?这是我需要在开始下载之前找出文件总大小的位置.我该怎么做呢?因为这个代码在下载之前似乎不知道文件的大小 - 这使得这个添加无关紧要.

procedure TInetThread.Execute;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  f: File;
  S: Bool;
  D: Integer;
  T: Integer;
  procedure DoWork(const Amt: Integer);
  begin
    if assigned(FOnWork) then
      FOnWork(Self, FSource, FDest, Amt, T);
  end;
begin
  S:= False;
  try
    try
      if not DirectoryExists(ExtractFilePath(FDest)) then begin
        ForceDirectories(ExtractFilePath(FDest));
      end;
      hSession:= InternetOpen(PChar(FAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
      try
        hURL:= InternetOpenURL(hSession, PChar(FSource), nil, …
Run Code Online (Sandbox Code Playgroud)

delphi wininet download progressive-download delphi-xe2

9
推荐指数
1
解决办法
5528
查看次数

Wininet InternetGetCookie获取空cookie数据

我目前正致力于使用Csharp获取cookie数据.我正在使用DLLImport在wininet.dll中调用InternetGetCookie,但是当我尝试它时,函数返回ERROR_INSUFFICIENT_BUFFER(错误代码122).

谁能帮我这个 ?

这是Dll参考的代码:

[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint="InternetGetCookie")]
        public static extern bool InternetGetCookie(string lpszUrl, string lpszCookieName,
            ref StringBuilder lpszCookieData, ref int lpdwSize);
Run Code Online (Sandbox Code Playgroud)

这就是我调用函数的方式:

InternetGetCookie("http://example.com", null, ref lpszCookieData, ref size)
Run Code Online (Sandbox Code Playgroud)

谢谢.

c# cookies wininet dll-reference

9
推荐指数
1
解决办法
6331
查看次数

如何使用WinInet发送HTTPS请求?

我想使用WinInet发送HTTPS GET请求.据我所知,我应该像发送HTTP请求一样,除了我必须使用INTERNET_DEFAULT_HTTPS_PORTINTERNET_FLAG_SECURE标志.

所以这是我试过的:

#include "stdafx.h"
#include <string>
#include <windows.h>
#include <WinInet.h>

#pragma comment (lib, "Wininet.lib")

using namespace std;


// convert string
wstring CharPToWstring(const char* _charP)
{
    return wstring(_charP, _charP + strlen(_charP));
}

// send https request
wstring SendHTTPSRequest_GET(const wstring& _server,
                             const wstring& _page,
                             const wstring& _params = L"")
{
    char szData[1024];

    // initialize WinInet
    HINTERNET hInternet = ::InternetOpen(TEXT("WinInet Test"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if (hInternet != NULL) 
    {
        // open HTTP session
        HINTERNET hConnect = ::InternetConnect(hInternet, …
Run Code Online (Sandbox Code Playgroud)

https winapi wininet request visual-c++

9
推荐指数
1
解决办法
1万
查看次数

我如何从delphi中检索WinInet错误代码的错误描述

我需要获取WinInet函数错误代码的描述,关于WinInet函数的MSDN文档说明GetLastError当函数失败时我必须使用该函数来检索最后的错误代码.现在,当我查看有关该GetLastError功能的文档说.

.要获取系统错误代码的错误字符串,请使用 FormatMessage函数

我检查哪个SysErrorMessagedelphi函数在内部调用FormatMessage winapi函数,所以我使用该函数来检索错误描述,但是不起作用(我的意思是不返回WinInet错误代码的描述)我在Delphi 2007中测试了这段代码和Delphi XE.

看到这段代码

uses
  Wininet, Windows, SysUtils;


procedure  TestWinInet(const AUrl : string);
var
  hInter,hRemoteUrl : HINTERNET;
  Code : Cardinal;
begin

  hInter := InternetOpen(PChar('Explorer 5.0'), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if hInter=nil then
  begin
    Code:=GetLastError;
    raise Exception.Create(Format('Error %d Description %s',[Code,SysErrorMessage(Code)]));
  end;

  try
    hRemoteUrl := InternetOpenUrl(hInter, PChar(AUrl), nil, 0, INTERNET_FLAG_RELOAD, 0);
    if hRemoteUrl=nil then
    begin
      Code:=GetLastError;
      raise Exception.Create(Format('Error %d Description %s',[Code,SysErrorMessage(Code)]));
    end;

    try
      //do something  else


    finally
     InternetCloseHandle(hRemoteUrl);
    end;
  finally …
Run Code Online (Sandbox Code Playgroud)

delphi error-handling winapi wininet

8
推荐指数
1
解决办法
3210
查看次数

WinInet如何确定缓存的内容和时间?

我正在尝试在我的.NET客户端和服务器之间进行缓存.在WinInet决定缓存结果之前,我看到一个看似随机的端点命中数.

.NET客户端使用HttpWebRequest以下命令发出请求

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uiTextBoxUrl.Text);
var policy = new RequestCachePolicy(RequestCacheLevel.CacheIfAvailable);
webRequest.CachePolicy = policy;
WebResponse webResponse = webRequest.GetResponse();
Run Code Online (Sandbox Code Playgroud)

使用ASP.net Web API实现的服务器设置以下CacheControl标头:

response.Headers.CacheControl = new CacheControlHeaderValue
        {
            MaxAge =3600,
            MustRevalidate = true,
            Public = true,
            Private = true
        };
Run Code Online (Sandbox Code Playgroud)

使用带有将请求发送到端点的按钮的测试工具,我可以看到,即使CacheIfAvailable使用了,也不会立即缓存响应.通过检查我的服务器上的调试输出,我发现在最终缓存请求之前需要触发看似随机数量的命中(或者更有可能是命中计数/经过时间启发式).如果我快速敲击测试按钮,它将在大约10次点击后开始缓存.如果我每隔1或2秒点击一次按钮,我就会计算最多25次点击,然后再进行缓存.

这是我从Fiddler看到的回应:

HTTP/200 responses are cacheable by default, unless Expires, Pragma, or Cache-Control headers are present and forbid caching.
HTTP/1.1 Cache-Control Header is present: …
Run Code Online (Sandbox Code Playgroud)

.net http wininet http-caching asp.net-web-api

8
推荐指数
1
解决办法
861
查看次数

从Internet下载文件,同时可以随时中止下载

我想从专门用于下载的单独线程中下载Delphi程序中的文件.

问题是主程序可以随时关闭(因此下载线程也可以随时终止).因此,即使没有连接或服务器滞后宝贵的秒钟,我需要一种方法在一两秒内终止下载线程.

你们建议使用什么功能?

我已经尝试过InterOpenURL/InternetReadFile但它没有超时参数.它有一个异步版本,但我找不到任何有用的Delphi示例,我不确定异步版本是否会保护我免受挂起...

以前建议使用套接字,但TClientSocket似乎也没有超时功能.

我需要做好充分准备,如果用户在他/她的计算机上遇到Internet连接问题或者网络服务器一直滞后我的应用程序在关闭之前就不会挂起.

在回答我不想使用任何第三方组件和Indy时请记住.非常感谢任何示例代码.

谢谢!

delphi multithreading wininet download delphi-7

7
推荐指数
2
解决办法
2595
查看次数

Delphi soap https身份验证失败会弹出一个对话框

我们有一个使用SOAP(THTTPRIO等)通信的delphi XE应用程序,默认情况下(在delphi中)通过WinInet.dll工作.我们使用https身份验证修复了身份验证代码以使其正常工作,并且当https的用户名和密码正确时,一切都很好.

问题是,当身份验证详细信息不正确时,您会从Windows获得一个消息框,这可能是由WinInet.dll本身弹出的.我想让那个对话框消失.我无法弄清楚如何更改我的Delphi SOAP,因此密码不会出现.

情况与以下方面的问题不同:

  1. 我正在做他正在做的所有事情,包括调用InternetSetOption(...)来设置用户名和密码.

  2. 我没有使用带有自签名证书的服务器,所以soIgnoreInvalidCerts标志不适用于我的情况.

  3. 不知何故,我想我需要在WinInet中获得一些API调用,告诉它不要弹出InternetErrorDlg它有弹出来询问用户的(有些版本的Windows说Windows安全选项).

  4. 在我的情况下,我们在配置文件中使用的用户名和密码正在使用,它是错误的(过时),因此我们希望WinInet代码只返回错误而不是弹出对话框.

也许这个家伙真正做到的另一个问题是如何做到这一点,但这个问题的细节不足以看出他是如何做到的.接受的答案对我不起作用.

我遵循的一些死胡同:

WinInet MSDN文档PLUGIN_AUTH_FLAGS_CAN_HANDLE_UI- 似乎不适用于WinInet用户,而是适用于插件.

WinInet MSDN文档讨论了InternetSetOption,一些新闻组引导我进入以下on-before-post事件处理程序代码:

procedure TMyDevice.HTTPWebNodeOnBeforePost(
  const HTTPReqResp: SOAPHTTPTrans.THTTPReqResp; Data: Pointer);
var
 SecurityFlagsLen:DWORD;
 SecurityFlags:DWORD;
begin
  { authentication, NTLM+HTTPS, WinInet authentication set via WinInet SET INTERNET OPTION API.
    This approach recommended on newsgroups for https basic authentication.  }

    if fUserName<>'' then
   if not InternetSetOption(Data,
               INTERNET_OPTION_USERNAME,
               PChar(fUserName),
               Length(fUserName)) then
     raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError));

   if fPassword<>'' then
  if not InternetSetOption(Data,
               INTERNET_OPTION_PASSWORD,
               PChar(fPassword),
               Length (fPassword)) then
     raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError)); …
Run Code Online (Sandbox Code Playgroud)

delphi soap wininet

7
推荐指数
1
解决办法
3277
查看次数