unit GetHttpInfo;

interface

uses Classes, WinINet, Sysutils, windows, IDURI, IdSSLOpenSSL
, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP; procedure Get(url: string; res: TStream); overload;
procedure Post(url, data: string; res: TStream); overload;
function Get(url: string): string; overload;
function WebPagePost(sURL, sPostData: string): Pointer; stdcall;
function WinPost(url, data: string):string; implementation function Get(url: string): string;
var
s: TStringStream;
begin
s := TStringStream.Create('');
try
Get(url, s); result := UTF8ToAnsi(s.DataString);
finally
s.Free;
end;
end; procedure Post(url, data: string; res: TStream);
var
hInt, hConn, hreq: HINTERNET;
buffer: PChar;
dwRead, dwFlags: cardinal;
port: Word;
uri: TIdURI;
proto, host, path, Params: string;
begin
uri := TIdURI.Create(url);
host := uri.Host;
path := uri.Path + uri.Document;
proto := uri.Protocol;
Params := uri.Params;
uri.Free;
if UpperCase(proto) = 'HTTPS' then
begin
port := INTERNET_DEFAULT_HTTPS_PORT;
dwFlags := INTERNET_FLAG_SECURE or INTERNET_FLAG_RELOAD;
end
else
begin
port := INTERNET_INVALID_PORT_NUMBER;
dwFlags := INTERNET_FLAG_RELOAD;
end;
hInt := InternetOpen('Delphi', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, );
hConn := InternetConnect(hInt, PChar(host), port, nil, nil, INTERNET_SERVICE_HTTP, , );
hreq := HttpOpenRequest(hConn, 'POST', PChar(Path + Params), 'HTTP/1.1', nil, nil, dwFlags, );
GetMem(buffer, );
data := AnsiToUTF8(data);
//if HttpSendRequestEx(hReq, nil, 0, PChar(data), Length(data) then
//if HttpSendRequestA(hReq, nil, 0, PChar(data), Length(data)) then
if HttpSendRequest(hReq, nil, , PChar(data), Length(data)) then
begin
dwRead := ;
repeat
InternetReadFile(hreq, buffer, , dwRead);
if dwRead <> then
res.Write(buffer^, dwRead);
until dwRead = ;
end;
InternetCloseHandle(hreq);
InternetCloseHandle(hConn);
InternetCloseHandle(hInt);
FreeMem(buffer);
end; procedure Get(url: string; res: TStream);
var
hInt, hUrl: HINTERNET;
buffer: PChar;
dwRead: cardinal;
begin
GetMem(buffer, ); hInt := InternetOpen('Delphi', INTERNET_OPEN_TYPE_DIRECT, nil, nil, );
dwRead := ;
hurl := InternetOpenUrl(hInt, PChar(url), nil, , INTERNET_FLAG_RELOAD, );
repeat
InternetReadFile(hUrl, buffer, , dwRead);
if dwRead <> then
res.Write(buffer^, dwRead);
until dwRead = ;
InternetCloseHandle(hUrl);
InternetCloseHandle(hInt);
FreeMem(buffer);
end; function WebPagePost(sURL, sPostData: string): Pointer; stdcall;
const
RequestMethod = 'POST';
HTTP_VERSION = 'HTTP/1.1'; //HTTP版本 我抓包看过 HTTP/1.0 HTTP/1.1。尚未仔细了解其区别。按MSDN来写的。留空默认是1.0
var
dwSize: DWORD;
dwFileSize: Int64;
dwBytesRead, dwReserved: DWORD;
hInte, hConnection, hRequest: HInternet;
ContentSize: array[..] of Char;
HostPort: Integer;
HostName, FileName, sHeader: string;
procedure ParseURL(URL: string; var HostName, FileName: string; var HostPort: Integer);
var
i, p, k: DWORD;
function StrToIntDef(const S: string; Default: Integer): Integer;
var
E: Integer;
begin
Val(S, Result, E);
if E <> then Result := Default;
end;
begin
if lstrcmpi('http://', PChar(Copy(URL, , ))) = then System.Delete(URL, , );
HostName := URL;
FileName := '/';
HostPort := INTERNET_DEFAULT_HTTP_PORT;
i := Pos('/', URL);
if i <> then
begin
HostName := Copy(URL, , i - );
FileName := Copy(URL, i, Length(URL) - i + );
end;
p := pos(':', HostName);
if p <> then
begin
k := Length(HostName) - p;
HostPort := StrToIntDef(Copy(HostName, p + , k), INTERNET_DEFAULT_HTTP_PORT);
Delete(HostName, p, k + );
end;
end;
begin
Result := Pointer(-);
dwFileSize := ;
ParseURL(sURL, HostName, FileName, HostPort);
// 函数原型见 http://technet.microsoft.com/zh-cn/subscriptions/aa385096(v=vs.85).aspx
hInte := InternetOpen('', //UserAgent
INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, );
if hInte <> nil then
begin
hConnection := InternetConnect(hInte, // 函数原型见 http://technet.microsoft.com/zh-cn/query/ms909418
PChar(HostName),
HostPort,
nil,
nil,
INTERNET_SERVICE_HTTP,
,
);
if hConnection <> nil then
begin
hRequest := HttpOpenRequest(hConnection, // 函数原型见 http://msdn.microsoft.com/zh-cn/library/aa917871
PChar(RequestMethod),
PChar(FileName),
HTTP_VERSION,
'', //Referrer 来路
nil, //AcceptTypes 接受的文件类型 TEXT/HTML */*
INTERNET_FLAG_NO_CACHE_WRITE or
INTERNET_FLAG_RELOAD,
);
if hRequest <> nil then
begin
sHeader := 'Content-Type: application/x-www-form-urlencoded' + ##;
// +'CLIENT-IP: 216.13.23.33'+#13#10
// 'X-FORWARDED-FOR: 216.13.23.33' + #13#10+; 伪造代理IP // 函数原型见 http://msdn.microsoft.com/zh-cn/library/aa384227(v=VS.85)
HttpAddRequestHeaders(hRequest, PChar(sHeader),
Length(sHeader),
HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
// 函数原型见 http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa384247(v=vs.85).aspx
if HttpSendRequest(hRequest, nil, , PChar(sPostData), Length(sPostData)) then
begin
dwReserved := ;
dwSize := SizeOf(ContentSize);
// 函数原型 http://msdn.microsoft.com/zh-cn/subscriptions/downloads/aa384238.aspx
if HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH, @ContentSize, dwSize, dwReserved) then
begin
dwFileSize := StrToInt(StrPas(@ContentSize));
GetMem(Result, dwFileSize);
InternetReadFile(hRequest, Result, dwFileSize, dwBytesRead);
end;
end;
end;
InternetCloseHandle(hRequest);
end;
InternetCloseHandle(hConnection);
end;
InternetCloseHandle(hInte);
end; function WinPost(url, data:string):string;
var
IdHttp : TIdHTTP;
ResponseStream : TStringStream; //返回信息
ResponseStr : string;
idSSL : TIdSSLIOHandlerSocket;
RequestList : TStringList; //请求信息
RequestStream : TStringStream;
begin
//创建IDHTTP控件
IdHttp := TIdHTTP.Create(nil);
idSSL := TIdSSLIOHandlerSocket.Create(nil);
//TStringStream对象用于保存响应信息
//res := TStringStream.Create('');
ResponseStream := TStringStream.Create('');
RequestStream := TStringStream.Create('');
RequestList := TStringList.Create;
try
try
idSSL.SSLOptions.Method:= sslvSSLv3;
IdHttp.IOHandler:= idSSL;
//以列表的方式提交参数
//RequestList.Add('text=love');
//IdHttp.Post(Url,RequestList,res);
IdHttp.Request.ContentType :='application/json';
//以流的方式提交参数
RequestStream.WriteString(data);
IdHttp.Post(Url,RequestStream,ResponseStream);
except end; //获取网页返回的信息
ResponseStr := ResponseStream.DataString;
result:= ResponseStr;
//网页中的存在中文时,需要进行UTF8解码
// ResponseStr := UTF8Decode(ResponseStr);
finally
IdHttp.Free;
RequestList.Free;
RequestStream.Free; end;
end; end.

使用WinPost提交数据在xp下没有问题,Post方法在win7以上没有问题.

WinPost只支持https提交,其它方法支持https和http

使用WinPost方法需要使用dll文件libeay32.dll、ssleay32.dll两个文件

delphi 模拟POST提交数据的更多相关文章

  1. cURL模拟POST提交数据

    首先,是这个代码: <?php //curl模拟post提交数据$url = "http://127.0.0.1/immoc/output.php";$post_data = ...

  2. 使用PHP模拟post提交数据

    使用PHP模拟post提交数据 分类: PHP LAMP 2013-04-13 12:03 3954人阅读 评论(0) 收藏 举报 CurlsocketPHP 这也是个老生常谈的话题了,上午花了点时间 ...

  3. Fiddler进行模拟Post提交数据,总为null解决方式

    Fiddler模拟post提交时总是为空,解决办法 如果是表单提交则要在header加上 ContentType:application/x-www-form-urlencoded 如果是要post提 ...

  4. php CURL 模拟 POST 提交数据

    <?php function liansuo_post($url,$data){ // 模拟提交数据函数 $curl = curl_init(); // 启动一个CURL会话 curl_seto ...

  5. php模拟post提交数据,用处很多,可用来网站的采集,登陆等等

    1. [代码][PHP]代码 <?php //以程序登陆一个论坛登录为例 function bbslogin($user_login, $password, $host, $port = &qu ...

  6. 三种方法教你如何用PHP模拟post提交数据

    php模拟post传值在日常的工作中用到的不是很多,但是在某些特定的场合还是经常用到的. 下面,我整理了三种php模拟post传值的方法,file_get_contents.curl和socket. ...

  7. 模拟form提交数据

    最近在做一个项目,发现ajax不能enctype=”multipart/form-data” 属性的表单,没办法,只能使用form表单直接提交的方法了,但是form表单直接提交会跳转页面,这样很不友好 ...

  8. Asp.Net模拟post提交数据方法

    方法1: System.Net.WebClient WebClientObj = new System.Net.WebClient(); System.Collections.Specialized. ...

  9. php模拟post提交数据

    $data = '{ "id": "17999030", "method": "sayHello", "jso ...

随机推荐

  1. [svc]rsyslog及logrotate小结

    [root@node1 logrotate.d]# ls dracut haproxy httpd mcelog nginx ppp psacct syslog yum yum install ngi ...

  2. HashMap 内部原理

    HashMap 内部实现 通过名字便可知道的是,HashMap 的原理就是散列.HashMap内部维护一个 Buckets 数组.每一个 Bucket 封装为一个 Entry<K, V> ...

  3. iOS开发多线程篇 07 —GCD的基本使用

    iOS开发多线程篇—GCD的基本使用 一.主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行. 提示:如果把任务放到主队列中进 ...

  4. Itunes connect上传应用视频 app preview时遇到“无法载入文件”的问题

    总结一下,上传视频的一个经验吧,在使用safari进行上传的时候,有时出现了问题,上传失败,但是提示语只有一句“无法载入文件,请再次尝试”.这样的提示并不能提供更多的信息,为什么视频无法上传.有这样的 ...

  5. 在linux下编译运行C++程序

    头一回...把windows下的程序挪到linux下,代码见这篇随笔 1.编译ZTHREAD,使用./configure失败,直接编译的,方法还是上面提到的那篇随笔 2.编译源码,最开始用的cc,后来 ...

  6. redis数据类型[string 、list 、 set 、sorted set 、hash]

    1. Keys  redis本质上一个key-value db,所以我们首先来看看他的key.  首先key也是字符串类型,但是key中不能包括边界字符:由于key不是binary safe的字符串, ...

  7. vim 设置

    TL;DR: $ git clone https://github.com/sontek/dotfiles.git $ cd dotfiles $ ./install.sh vim Download  ...

  8. C++11 中function和bind以及lambda 表达式的用法

    关于std::function 的用法:  其实就可以理解成函数指针 1. 保存自由函数 void printA(int a) { cout<<a<<endl; } std:: ...

  9. linux2.6内核netfilter架构分析

    1.2.6内核的netfilter与2.4的有很大不同: ChangeLog-2.6.15 中有下面这样的描述: commit 9fb9cbb1082d6b31fb45aa1a14432449a0df ...

  10. Android Studio无法启动,gradle下载不了 提示“building “ 项目名”gradle project info”

    Google在2013年I/O大会上发布了Android Studio,AndroidStudio是一个基于IntelliJ思想的新的Android开发工具.下面介绍一下Android Studio安 ...