我正在尝试使用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响应页面作为字符串获取.
我正在运行它来测试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这样的东西.
什么看错了?谢谢.
我一直在使用3G无线网卡,每次连接时,我的防病毒软件都会启动更新.
我想知道什么是Win32 API函数集,我可以用来获得通知或查询有关Internet连接即将发生的事件?
是否已经为Delphi提供了一组端口标头?
我从第三方网站获得了以下来源,解释了如何使用互联网下载文件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) 我目前正致力于使用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)
谢谢.
我想使用WinInet发送HTTPS GET请求.据我所知,我应该像发送HTTP请求一样,除了我必须使用INTERNET_DEFAULT_HTTPS_PORT和INTERNET_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) 我需要获取WinInet函数错误代码的描述,关于WinInet函数的MSDN文档说明GetLastError
当函数失败时我必须使用该函数来检索最后的错误代码.现在,当我查看有关该GetLastError
功能的文档说.
.要获取系统错误代码的错误字符串,请使用 FormatMessage函数
我检查哪个SysErrorMessage
delphi函数在内部调用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) 我正在尝试在我的.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) 我想从专门用于下载的单独线程中下载Delphi程序中的文件.
问题是主程序可以随时关闭(因此下载线程也可以随时终止).因此,即使没有连接或服务器滞后宝贵的秒钟,我需要一种方法在一两秒内终止下载线程.
你们建议使用什么功能?
我已经尝试过InterOpenURL/InternetReadFile但它没有超时参数.它有一个异步版本,但我找不到任何有用的Delphi示例,我不确定异步版本是否会保护我免受挂起...
以前建议使用套接字,但TClientSocket似乎也没有超时功能.
我需要做好充分准备,如果用户在他/她的计算机上遇到Internet连接问题或者网络服务器一直滞后我的应用程序在关闭之前就不会挂起.
在回答我不想使用任何第三方组件和Indy时请记住.非常感谢任何示例代码.
谢谢!
我们有一个使用SOAP(THTTPRIO等)通信的delphi XE应用程序,默认情况下(在delphi中)通过WinInet.dll工作.我们使用https身份验证修复了身份验证代码以使其正常工作,并且当https的用户名和密码正确时,一切都很好.
问题是,当身份验证详细信息不正确时,您会从Windows获得一个消息框,这可能是由WinInet.dll本身弹出的.我想让那个对话框消失.我无法弄清楚如何更改我的Delphi SOAP,因此密码不会出现.
情况与以下方面的问题不同:
我正在做他正在做的所有事情,包括调用InternetSetOption(...)来设置用户名和密码.
我没有使用带有自签名证书的服务器,所以soIgnoreInvalidCerts标志不适用于我的情况.
不知何故,我想我需要在WinInet中获得一些API调用,告诉它不要弹出InternetErrorDlg
它有弹出来询问用户的(有些版本的Windows说Windows安全选项).
在我的情况下,我们在配置文件中使用的用户名和密码正在使用,它是错误的(过时),因此我们希望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)